编辑:我这只是关于Fortran的一个问题,并将开始一个关于转换为MATLAB的新问题。
ORIGINAL:
我正在研究一个项目,并试图将一些旧的Fortran代码移植到Matlab中。我几乎没有Fortran经验,所以我不太确定以下代码中发生了什么。 Fortran代码只是用于解释二进制文件中的数据,我在将内容移植到MATLAB中取得了一些不错的进展,但是在以下部分遇到了困难:
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
我所困扰的是获得SCALE
的正确值,因为我不确定RL4
发生了什么。有人可以向我解释为什么RL4会改变值以及什么过程会改变它以便我可以将这个过程放到MATLAB中?
答案 0 :(得分:0)
代码可能会更改Endianness - 字节交换。 equivalence
表示等价变量共享内存,您可以在文件交换后将从文件读取的4个字节视为一个数字。
因此,四个字节被解释为四字节实数RL4
并在此之后转换为double precision
值scale
。
仅当逻辑lflag
为真时才进行字节交换。这可能是当文件的字节顺序与机器本机字节顺序不同时。
在Matlab中,您可以使用http://www.mathworks.com/help/matlab/ref/swapbytes.html。
只需读取4字节浮点数并在必要时交换字节。