Fortran Coder

查看: 15828|回复: 7
打印 上一主题 下一主题

[文件读写] Fortran读规定格式文本文件中复数矩阵的难题

[复制链接]

18

帖子

3

主题

0

精华

熟手

F 币
116 元
贡献
73 点
跳转到指定楼层
楼主
发表于 2014-5-8 20:57:22 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
在下用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!

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

8#
发表于 2014-5-9 18:24:11 | 只看该作者
楼上说得没错,有条件的话,使用一些更标准的格式会更好。或者自己规定一些比较简单鲜明的格式,对自己,对他人,都有好处

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

7#
发表于 2014-5-9 10:39:52 | 只看该作者
请输出成标准的矩阵存储格式,譬如
Matrix Market Exchange Formats
Harwell-Boeing Exchange Format

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

6#
发表于 2014-5-8 23:50:03 | 只看该作者
山大克鲁士 发表于 2014-5-8 22:50
再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~ ...

加论坛对应的fortran群: 2338021

18

帖子

3

主题

0

精华

熟手

F 币
116 元
贡献
73 点
5#
 楼主| 发表于 2014-5-8 22:50:55 | 只看该作者
再次膜拜大神,学生的接口函数全弄好了,多亏了大神才能让学生实现Matlab、C、Fortran的数据文件无缝衔接~~~
大神方便留个qq吗?当然学生绝不会经常打扰的~~~
学生的qq是45152364~

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2014-5-8 21:42:28 | 只看该作者
77 和 90 没有太严格的界限。就像 C99 和 C89 一样。

但是 77 不允许用 allocatable 的数组,呵呵。现在建议不要特意学习 77 了

18

帖子

3

主题

0

精华

熟手

F 币
116 元
贡献
73 点
板凳
 楼主| 发表于 2014-5-8 21:36:44 | 只看该作者
首先拜谢大神,我马上将您的代码弄进去试试~~~
P.S: 我也弄不清是77还是90,因为在下是C coder过来的,所以很多时候对fortran的东东还很迷糊。。。

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2014-5-8 21:26:33 | 只看该作者
首先,你的代码不是 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  
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 05:30

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表