【问题标题】:Data interpretation between Matlab and FortranMatlab 和 Fortran 之间的数据解释
【发布时间】:2014-07-23 05:26:53
【问题描述】:

我有一些解释二进制文件的 Fortran 代码。感谢另一个问题,我问我了解 fortran 代码的工作原理,但我需要帮助将其更改为 MATLAB 代码。这是 Fortran 代码:

  IMPLICIT NONE

  DOUBLE PRECISION      SCALE

  CHARACTER*72          BLINE
  CHARACTER*72          DATA_FILE_FULL_NAME
  CHARACTER*6           DATA_FILE_NAME

  CHARACTER*4           CH4, CH4F
  REAL*4                RL4
  EQUIVALENCE          (RL4,CH4)

  CHARACTER*2           C2
  LOGICAL               LFLAG

  INTEGER*2             I2

  if(i2.eq.13881) LFLAG=.FALSE.

  c2='69'
  LFLAG=.TRUE.

  DATA_FILE_FULL_NAME='./'//DATA_FILE_NAME//'.DAT'

  OPEN(UNIT=20, FILE=DATA_FILE_FULL_NAME, ACCESS='DIRECT',
 .     RECL=72, status='OLD')
    READ(20,REC=1) BLINE
    CH4f=BLINE(7:10)
    call flip(4,lflag,ch4f,ch4)
    SCALE=RL4

  RETURN
  END  

c   ..................................................
    subroutine flip(n,lflag,ch1,ch2)
c   ..................................................

  integer*4        n, i
  character*(*)    ch1, ch2
  logical          lflag

  if(lflag) then
    do i=1,n
      ch2(i:i)=ch1(n-i+1:n-i+1)
    enddo
  else
    ch2=ch1
  endif

  return
  end   

所以基本上(我相信我理解正确)Fortran 代码正在检查字节序,如果机器和数据不匹配,则将其翻转。此外,数据存储在内存中为 CH4 和 RL4 保留的位置,因此通过在定义 CH4 后调用 RL4,数据只是被转换为 REAL*4 类型而不是 CHARACTER*4 类型。现在我需要弄清楚如何将它移植到 Matlab 中。我已经有能力读取原始数据,但是当我尝试各种形式的解释时,我总是得到错误的答案。到目前为止,我已经尝试过:

fid=fopen(LMK_file,'r');
BLINE=fread(fid, 72,'char=>char');
CH4=BLINE(7:10);
SCALE=single(CH4(1)+CH4(2)+CH4(3)+CH4(4));

SCALE=int8(CH4(1)+256*int8(CH4(2))+256^2*int8(CH4(3))+256^3*int8(CH4(4));

在 MATLAB 中,但两者都给了我相同的错误答案(这是有道理的,因为它做的事情几乎相同)。

有什么建议吗?

【问题讨论】:

  • 您阅读过fread 的文档吗?特别是对于machinefmt 选项,它允许您directly read in data with different edianness?
  • 我告诉过你忘记任何 'ch4' 有充分的理由最好是关注 @horchler,否则你可以读取一个浮点数并对其应用 'swapbytes'。
  • 也许你可以试试f2matlab自动转换这段代码。
  • @CitizenInsane "F2MATLAB LIMITATIONS:f2matlab 还不能处理 fortran90 的一些特性。其中包括:不能处理困难的 IO 和读写语句、goto(当然)、等价和指针。 "这个问题是关于 I/O 和equivalence
  • 对不起@VladimirF。我确实接受了您的建议,只是忘记将其从此处删除。 @horchler。我会尝试看看machinefmt 选项。

标签: matlab binary fortran


【解决方案1】:

对于正在寻找这个问题的答案的其他人,这是我在 cmets 的帮助下得出的结论。

fid=fopen(LMK_file,'r');  %open the file for reading
IGNORE=fread(fid,6,'*char');  %ignore the first 6 bytes.  This could also be performed using fseek
SCALE=fread(fid,1,'*float32','b');  %reading in the scale value as a floating point 32 bit number. 

b 表示文件的大字节序。通过使用 '*float32' 选项,fread 会自动将接下来的 4 个字符解释为 32 位浮点数。

这会从给定文件中返回正确的比例值。

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2017-01-03
    • 1970-01-01
    • 2011-06-05
    • 2017-07-23
    • 2019-01-25
    • 2015-07-22
    • 2014-07-28
    • 2020-11-13
    相关资源
    最近更新 更多