【问题标题】:Data reading in FortranFortran 中的数据读取
【发布时间】:2014-07-23 01:21:54
【问题描述】:

编辑:我只是提出一个关于 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   

我所坚持的是获得SCALE 的正确值,因为我不确定RL4 发生了什么。有人可以向我解释一下为什么 RL4 会改变价值以及什么过程会改变它,以便我可以将这个过程放入 MATLAB 中吗?

【问题讨论】:

  • RL4 似乎不应该从您的代码中更改其值。它似乎实际上是未定义的。
  • 我也是这么想的@VladimirF;但是它确实发生了变化,并且显然给出了正确的答案,因为这是许多不同人使用的代码的摘录。
  • 可能不是完整的摘录。
  • 啊,我刚刚在某些时候发现了这一点,在代码EQUIVALENCE (RL4,CH4) 中调用了以下代码。我已将此行添加到代码中。
  • 我完全怀疑这一点。

标签: matlab fortran binaryfiles


【解决方案1】:

代码可能确实改变了Endianness - 字节交换。 equivalence 表示等价的变量共享内存,你可以把从文件中读取的4个字节当作字节交换后的数字。

因此,这四个字节被解释为一个四字节实数RL4,然后转换为double precisionscale

仅当逻辑lflag 为真时才进行字节交换。这可能是当文件的字节顺序与机器本机字节顺序不同时。

在 Matlab 中你可能可以使用 http://www.mathworks.com/help/matlab/ref/swapbytes.html

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

【讨论】:

  • 不要在 Matlab 中玩任何ch4f 任何东西,只需使用函数swapbytes
  • 好的,我现在意识到我问问题的方式不是很好,所以我将把这个问题写成关于 fortran 并接受你的回答,然后我会问一个关于转换为的新问题MATLAB。我已经尝试了交换字节,但它并没有再次得到正确的答案。
猜你喜欢
  • 2014-06-12
  • 2012-02-08
  • 2013-06-23
  • 2019-11-15
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多