【发布时间】: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选项。