Fortran读规定格式文本文件中复数矩阵的难题
在下用VS2010 + IVF写了一个读任意m × n阶复矩阵的函数,含有复矩阵的文件格式如下图所示。我的fortran77代码如下所示:
!========================================
! 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!
首先,你的代码不是 Fortran77 的,至少是 Fortran90 的
其次,你这个格式确实不好读,需要绕一些弯。
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 首先拜谢大神:-kiss:,我马上将您的代码弄进去试试~~~
P.S: 我也弄不清是77还是90,因为在下是C coder过来的,所以很多时候对fortran的东东还很迷糊。。。 77 和 90 没有太严格的界限。就像 C99 和 C89 一样。
但是 77 不允许用 allocatable 的数组,呵呵。现在建议不要特意学习 77 了 再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~~~
大神方便留个qq吗?当然学生绝不会经常打扰的~~~
学生的qq是45152364~ 山大克鲁士 发表于 2014-5-8 22:50
再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~ ...
加论坛对应的fortran群: 2338021 请输出成标准的矩阵存储格式,譬如
Matrix Market Exchange Formats
Harwell-Boeing Exchange Format
楼上说得没错,有条件的话,使用一些更标准的格式会更好。或者自己规定一些比较简单鲜明的格式,对自己,对他人,都有好处
页:
[1]