Fortran Coder

标题: Fortran读规定格式文本文件中复数矩阵的难题 [打印本页]

作者: 山大克鲁士    时间: 2014-5-8 20:57
标题: Fortran读规定格式文本文件中复数矩阵的难题
在下用VS2010 + IVF写了一个读任意m × n阶复矩阵的函数,含有复矩阵的文件格式如下图所示。


我的fortran77代码如下所示:
[Fortran] 纯文本查看 复制代码
!========================================
          ! Open file in ANSI mode
          open(UNIT = fid, FILE = strFileName,
     &         ACCESS = 'SEQUENTIAL', ACTION = 'READ',
     &         FORM = 'FORMATTED', STATUS = 'OLD')

          ! This is a m X n complex matrix as:
          read(fid, *) strBuf, strBuf, strBuf,
     &    m, strBuf, n, strBuf, strBuf, strBuf

          ! Memory allocation for A
          allocate(A(m,n), STAT = ierr)
          ! Out of memory
          if (ierr .ne. 0) then
              close(fid, STATUS = 'KEEP')
              print *, 'Out of memory!'
              ReadZMatrixFromFile32 = .false.
              return
          end if

          ! Read matrix from file in row-major format
          ! 下一行肯定是错的,但我真心不知道咋整了。。。
          read(fid, *) ((A(i,j), j=1,n), i=1,m)

          ! Close file
          close(fid, STATUS = 'KEEP')
!======================================

还望大神们指点迷津啊~
Thanks in advance!


作者: fcode    时间: 2014-5-8 21:26
首先,你的代码不是 Fortran77 的,至少是 Fortran90 的

其次,你这个格式确实不好读,需要绕一些弯。

[Fortran] 纯文本查看 复制代码
character( len = 64 ) :: cTemp
character( len = 64 ) , allocatable :: cImag(:)
character( len = 1 ) , allocatable :: cSign(:)
real , allocatable :: rReal(:)
real :: tImag , tSign
integer :: i , j , k
Open(12,File='in.txt')
allocate(cImag(n)) !// 如果 n 是列数
allocate(cSign(n))
allocate(rReal(n))
Do i = 1 , m
  read( fid , * ) (( rReal(j) , cSign(j) , cImag(j) ) , j = 1 , n )
  Do j = 1 , n
    tSign = 1.0
    if ( cSign(j) == '-' ) tSign = -1.0
    cTemp = cImag(j)
    k = Len_Trim(cTemp)
    cTemp(k:k) = ''
    read( cTemp , * ) tImag
    A( i , j ) = cmplx(rReal(j) , tSign * tImag )
  End Do
End Do  

作者: 山大克鲁士    时间: 2014-5-8 21:36
首先拜谢大神,我马上将您的代码弄进去试试~~~
P.S: 我也弄不清是77还是90,因为在下是C coder过来的,所以很多时候对fortran的东东还很迷糊。。。
作者: fcode    时间: 2014-5-8 21:42
77 和 90 没有太严格的界限。就像 C99 和 C89 一样。

但是 77 不允许用 allocatable 的数组,呵呵。现在建议不要特意学习 77 了
作者: 山大克鲁士    时间: 2014-5-8 22:50
再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~~~
大神方便留个qq吗?当然学生绝不会经常打扰的~~~
学生的qq是45152364~
作者: aliouying    时间: 2014-5-8 23:50
山大克鲁士 发表于 2014-5-8 22:50
再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~ ...

加论坛对应的fortran群: 2338021
作者: pasuka    时间: 2014-5-9 10:39
请输出成标准的矩阵存储格式,譬如
Matrix Market Exchange Formats
Harwell-Boeing Exchange Format

作者: fcode    时间: 2014-5-9 18:24
楼上说得没错,有条件的话,使用一些更标准的格式会更好。或者自己规定一些比较简单鲜明的格式,对自己,对他人,都有好处




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2