Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以二进制形式编写Matlab数组,然后用Fortran读取?_Matlab_Fortran_Intel Fortran - Fatal编程技术网

如何以二进制形式编写Matlab数组,然后用Fortran读取?

如何以二进制形式编写Matlab数组,然后用Fortran读取?,matlab,fortran,intel-fortran,Matlab,Fortran,Intel Fortran,我对Linux和Fortran都非常陌生,如果这是一个基本问题,我深表歉意 我首先尝试使用fwrite将我在MATLAB中生成的60x150数组保存为二进制文件,然后尝试再次将其作为60x150数组加载并在Fortran中读取 在Matlab中,我使用了以下代码来保存数组。在本例中,工作区中数组的名称为VP,我将其保存到一个名为“VP”的文件中: >fileID=fopen('VP','w'); >>fwrite(fileID,VP,'real*8'); >>fclose(文件ID) 接下来,

我对Linux和Fortran都非常陌生,如果这是一个基本问题,我深表歉意

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

在Matlab中,我使用了以下代码来保存数组。在本例中,工作区中数组的名称为VP,我将其保存到一个名为“VP”的文件中:

>fileID=fopen('VP','w');
>>fwrite(fileID,VP,'real*8');
>>fclose(文件ID)
接下来,我将文件从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理解的一个基本问题,因为我正在从事的一个项目(我正在运行的大多数代码是由其他人生成的,我只是试图编辑其中的一小部分)让我陷入了困境


编辑:

好的,非常感谢弗朗西斯卡勒斯!他发现解决方案是编辑该行以读取(单位)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

谢谢你的帮助。

它是否与
读取(单位)VP(inx2,inx)
一起工作?噢,天哪,是的。虽然,现在我有一个小问题,fortran中的VP(1:10,1)(只是检查正确性)与matlab中的VP(1:10,1)或VP(1,1:10)不同,除了第一个值。将
read(unit,*)
更改为
read(unit)
是一个常见的方面(重复项可用),因此,如果您在更正后编辑问题,将重点放在
VP
值的问题上,这可能是最好的。谢谢,我已在下一期编辑了问题。我非常感谢您的帮助,希望有人能在下一阶段帮助我。如果您使用的是
access=stream
,只需阅读文件,而不需要
do
循环。也就是说,执行
读取(单位)vp
。这可能会转换为单个IO操作,而不是嵌套循环的inx*inx2 IO操作。它是否与
READ(unit)VP(inx2,inx)
一起工作?哦,我的话,是的。虽然,现在我有一个小问题,fortran中的VP(1:10,1)(只是检查正确性)与matlab中的VP(1:10,1)或VP(1,1:10)不同,除了第一个值。将
read(unit,*)
更改为
read(unit)
是一个常见的方面(重复项可用),因此,如果您在更正后编辑问题,将重点放在
VP
值的问题上,这可能是最好的。谢谢,我已在下一期编辑了问题。我非常感谢您的帮助,希望有人能在下一阶段帮助我。如果您使用的是
access=stream
,只需阅读文件,而不需要
do
循环。也就是说,执行
读取(单位)vp
。这可能会转换为单个IO操作,而不是嵌套循环的inx*inx2 IO操作。