Matlab Fortran语言中的数据读取
编辑:我将这仅仅是一个关于Fortran的问题,并将开始一个关于转换为MATLAB的新问题 原件: 我正在做一个项目,试图将一些旧的Fortran代码移植到Matlab中。我几乎没有Fortran的经验,所以我不太确定下面的代码中发生了什么。Fortran代码仅用于解释二进制文件中的数据,我在将数据移植到MATLAB方面取得了一些不错的进展,但在以下部分遇到了困难:Matlab Fortran语言中的数据读取,matlab,fortran,binaryfiles,Matlab,Fortran,Binaryfiles,编辑:我将这仅仅是一个关于Fortran的问题,并将开始一个关于转换为MATLAB的新问题 原件: 我正在做一个项目,试图将一些旧的Fortran代码移植到Matlab中。我几乎没有Fortran的经验,所以我不太确定下面的代码中发生了什么。Fortran代码仅用于解释二进制文件中的数据,我在将数据移植到MATLAB方面取得了一些不错的进展,但在以下部分遇到了困难: IMPLICIT NONE DOUBLE PRECISION SCALE CHARACTER*72
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
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
我一直坚持的是获得正确的比例值,因为我不确定RL4到底发生了什么。有人能给我解释一下为什么RL4会改变值,是什么过程改变了值,这样我就可以把这个过程放到MATLAB中了?代码可能会改变字节交换。等价性意味着等价变量共享内存,可以在字节交换后将从文件中读取的4个字节视为一个数字 因此,这四个字节被解释为四字节实RL4,并在此之后转换为双精度值刻度 只有当逻辑lflag为真时,才进行字节交换。当文件的字节顺序与机器本机字节顺序不同时,可能会出现这种情况 在Matlab中,您可能可以使用
只要读取4字节的浮点数,并在必要时交换字节。看来RL4不应该从代码中更改其值。事实上,它似乎没有定义。这也是我所想的@VladimirF;然而,它确实发生了变化,显然给出了正确的答案,因为这是许多不同的人使用的代码的摘录。可能不是一个完整的摘录。啊,我只是在某个时候发现了这一点,在代码等价物RL4,CH4中调用了以下内容。我已经在代码中添加了这一行。我完全怀疑这一点。不要在Matlab中使用任何ch4f,只使用函数swapbytes。好的,我现在意识到我问问题的方式不是很好,所以我将用fortran编写这一行,并接受你的答案,然后我将问一个关于转换为Matlab的新问题。我尝试了交换字节,但结果再次不正确。