Matlab Fortran语言中的数据读取

Matlab Fortran语言中的数据读取,matlab,fortran,binaryfiles,Matlab,Fortran,Binaryfiles,编辑:我将这仅仅是一个关于Fortran的问题,并将开始一个关于转换为MATLAB的新问题 原件: 我正在做一个项目,试图将一些旧的Fortran代码移植到Matlab中。我几乎没有Fortran的经验,所以我不太确定下面的代码中发生了什么。Fortran代码仅用于解释二进制文件中的数据,我在将数据移植到MATLAB方面取得了一些不错的进展,但在以下部分遇到了困难: IMPLICIT NONE DOUBLE PRECISION SCALE CHARACTER*72

编辑:我将这仅仅是一个关于Fortran的问题,并将开始一个关于转换为MATLAB的新问题

原件:

我正在做一个项目,试图将一些旧的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   

我一直坚持的是获得正确的比例值,因为我不确定RL4到底发生了什么。有人能给我解释一下为什么RL4会改变值,是什么过程改变了值,这样我就可以把这个过程放到MATLAB中了?

代码可能会改变字节交换。等价性意味着等价变量共享内存,可以在字节交换后将从文件中读取的4个字节视为一个数字

因此,这四个字节被解释为四字节实RL4,并在此之后转换为双精度值刻度

只有当逻辑lflag为真时,才进行字节交换。当文件的字节顺序与机器本机字节顺序不同时,可能会出现这种情况

在Matlab中,您可能可以使用


只要读取4字节的浮点数,并在必要时交换字节。

看来RL4不应该从代码中更改其值。事实上,它似乎没有定义。这也是我所想的@VladimirF;然而,它确实发生了变化,显然给出了正确的答案,因为这是许多不同的人使用的代码的摘录。可能不是一个完整的摘录。啊,我只是在某个时候发现了这一点,在代码等价物RL4,CH4中调用了以下内容。我已经在代码中添加了这一行。我完全怀疑这一点。不要在Matlab中使用任何ch4f,只使用函数swapbytes。好的,我现在意识到我问问题的方式不是很好,所以我将用fortran编写这一行,并接受你的答案,然后我将问一个关于转换为Matlab的新问题。我尝试了交换字节,但结果再次不正确。