如何以二进制形式编写Matlab数组,然后用Fortran读取?
我对Linux和Fortran都非常陌生,如果这是一个基本问题,我深表歉意 我首先尝试使用fwrite将我在MATLAB中生成的60x150数组保存为二进制文件,然后尝试再次将其作为60x150数组加载并在Fortran中读取 在Matlab中,我使用了以下代码来保存数组。在本例中,工作区中数组的名称为VP,我将其保存到一个名为“VP”的文件中:如何以二进制形式编写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) 接下来,
>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操作。