【问题标题】:Reading from binary file in Fortran, how can I do the same thing in Matlab?从 Fortran 中的二进制文件读取,我如何在 Matlab 中做同样的事情?
【发布时间】:2012-08-06 13:32:55
【问题描述】:

我对此很陌生,我正在尝试将程序从 Fortran 翻译到 Matlab。我对 Fortran 中的 READ 函数有疑问。我有以下定义:

DIMENSION ET2(2),PV(6,12),PNUT(4),T(2),PJD(4),BUF(1500),SS(3),CVAL(400),PVSUN(3,2)
INTEGER LIST(12),IPT(3,13)

CHARACTER*6 TTL(14,3),CNAM(400)                                           
CHARACTER*80 NAMFIL 

COMMON/EPHHDR/CVAL,SS,AU,EMRAT,NUMDE,NCON,IPT                             
COMMON/CHRHDR/CNAM,TTL                                                    
COMMON/STCOMX/KM,BARY,PVSUN    

我试图理解/翻译的阅读语句如下:

READ(NRFILE,REC=1)TTL,CNAM,SS,NCON,AU,EMRAT,((IPT(I,J),I=1,3),J=1,12),NUMDE,(IPT(I,13),I=1,3)

READ(NRFILE,REC=2)CVAL 

英语不是我的母语,我不太确定我是否理解了 REC 的定义。如果我例如有一个由四个不同整数组成的文件,REC=2 是否表明我开始从第二个整数读取?

其次,我想知道接下来会发生什么。我假设来自 NRFILE 的信息保存在不同的变量中,TTL,CNAM ...? NRFILE 指的是二进制文件,但我不明白程序如何知道要在每个变量中存储哪些信息。我假设相同的信息没有存储在 TTL 和 CNAM 中,因为它们具有不同的维度?

有谁知道这在 matlab 中会是什么样子?到目前为止,我只能写 cval=fread(filID),但我忽略了 REC 语句..

【问题讨论】:

    标签: fortran


    【解决方案1】:

    “REC=n”用于直接访问读取。可以按任何顺序读取直接访问文件中的记录,可能是乱序的。您的示例显示它们按顺序读取,因此可能未使用此功能,尽管您仅显示前两个读取。直接访问记录通常是固定长度的; Fortran 可能会忽略它通常添加到非流无格式顺序文件中的记录长度信息。

    I/O 列表中的变量按照记录中的字节出现在列表中的顺序填充。 IPT 使用隐含的执行列表填充。如果不够明显,您可以在此处找到相关问题。

    显示文件的打开语句可能会有所帮助。

    【讨论】:

    • 那么,REC=1 不代表只会读取第一条记录?这意味着它将从第一条记录开始读取,然后再读取下一条记录,依此类推?
    • 打开语句:OPEN(NRFILE,FILE=NAMFIL,ACCESS='DIRECT',FORM='UNFORMATTED',RECL=IRECSZ, STATUS='OLD') 所以我猜每条被读取的记录都包括与 RECL 等效的字节数是多少?我对如何在 matlab 中实现这一点有点不确定。我认为很难翻译以便正确的记录最终出现在正确的变量或数组中。我怎么知道进入例如的记录数。 TTL?如果我要在 matlab 中实现这个,首先将前 n 字节(我想是 TTL 的大小?)读入 TTL,然后再从那里读入 CNAM 是否正确?
    【解决方案2】:

    如果您要将 fortran 转换为 matlab,请尝试使用 f2matlab。它通常可以为您完成大部分工作。虽然你必须在 f2matlab 完成后检查翻译(包括这些读取语句)。

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 2021-12-08
      • 2013-02-17
      • 2017-12-01
      • 2012-04-29
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多