如何编写一个Matlab数组为二进制,然后在Fortran中读取它?

时间:2019-04-01 14:35:04

标签: matlab fortran intel-fortran

我对于在Linux和Fortran上工作都是非常陌生的,如果这是一个基本问题,我深表歉意。

我试图首先使用fwrite将我在MATLAB中生成的60x150数组另存为二进制文件,然后尝试再次将其作为60x150数组加载并读入Fortran。

在Matlab中,我使用以下代码保存数组。在这种情况下,工作空间中数组的名称为VP,我将其保存到也称为“ VP”的文件中:

>> fileID = fopen('VP','w');
>> fwrite(fileID,VP,'real*8');
>> fclose(fileID)

接下来,我将文件从Windows复制到linux ssh服务器(我不确定这是否相关,但认为包括所有可能有用的内容都是值得的)。

现在,在我的Fortran代码中,我得到了:

REAL(KIND=kind(1.0D0)), DIMENSION(60,150) :: VP
...
open(unit, file="LOCATION/VP", access = "stream", form = "unformatted", iostat = stat)
  if(stat /= 0) labort("Failed to open input file")
print *, wl
DO inx2=1,60
 DO inx=1,150
  print *,inx
  READ(unit,*) VP(inx2,inx)
 ENDDO
ENDDO
   print *,VP(1:10,1)

现在,当我编译它时,没有错误。但是,当我运行它时,它会在失败之前准确到达第一个“ READ(unit,*)VP(inx2,inx)”(您可以从打印前的内容中看出来)。

我得到了错误:

forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 111, file LOCATION/VP

显然,我希望我的实际结果是函数运行并以数组中的相同值结束。

现在我之前已经看到了这个问题,特别是针对此错误消息的,但是通过包含我已经拥有的access="stream"来回答。基本上,我不确定在此过程中什么时候出现了问题,将不胜感激。

请注意,我尝试过的一些操作是更改fwrite的精度,并交换inx2和inx值(但在第一个操作上失败,因此我不认为这是错误的原因)。

同样,这可能只是我对Fortran的理解中的一个基本问题,因为我对自己正在从事的项目有所了解(我正在运行的大部分代码是由其他人制作的) ,我只是尝试编辑其中的一小部分。)


编辑:

好的,非常感谢francescalus!他发现解决方案是将行编辑为READ(unit)VP(inx2,inx)以使其运行。但是,我通过运行下一行代码获得的值:

print *,VP(1:10,1)

只有第一个值与我原始的matlab数组中的第一个值匹配。在显示matlab数组的VP(1:5,1:5)时,没有其他匹配值。我也许可以自己解决这个问题,但是由于我已经在这里,所以我还想问一问,因为我还没有完全完成原始问题(尽管遇到了很大的障碍!)。


编辑2:

好吧,接下来我已经为自己找到了答案。如果有人在搜索,那只是交换DO循环的一种情况。即

DO inx=1,150
 DO inx2=1,60
  print *,inx
  READ(unit,*) VP(inx2,inx)
 ENDDO
ENDDO

感谢您的帮助。

0 个答案:

没有答案