【问题标题】:reading a fortran binary file into matlab将fortran二进制文件读入matlab
【发布时间】:2017-12-01 03:12:47
【问题描述】:

在我的 fortran 代码中,我将结果输出到二进制文件中。

      open(21,file=anum('press',itime),form=format_mode)
  write(21) rtime,itime,dt,nx0,ny0,nz,deltax,deltay,rlenz
  write(21) rw
  close(21)

以上是写入和保存文件的fortran代码。

我现在想在 matlab 中打开并分析它:

fid = open('press.420000');
A = fread(fid);
close(fid);

然而,这只会创建一个一维数组,我猜它也包括所有标题信息。

我希望 Matlab 读取标头值,但不将它们包含到最终数组中。我打算将数组重塑为 3d 数组,因为数据来自 cfd 模拟,其网格为 256x512x390 = 51,180,80

Matlab 代码给了我一个 411,343,976 的一维数组,这是不正确的。

因此我正在努力如何读取二进制文件。我需要一些关于如何编写 Matlab 脚本来读取二进制文件的指导

【问题讨论】:

  • 我建议更改 Fortran 以编写文本文件,并让 Matlab 读取文本文件。
  • 如果matlab确实有二进制文件读取能力,那就是fortran流文件open(access='stream'...)
  • format_mode 的值是多少?这是一个非常重要的信息。
  • format_mode 必须是 unformatted 否则 write 会失败。我的建议是使用access=stream 而不是哄着matlab 来读取神秘的fortran 默认顺序访问格式。另一个问题当然是两个程序中的变量类型必须相同。

标签: matlab binary fortran


【解决方案1】:

可以读取字节向量中的数据:

bytevec = fread(fid, inf, 'uint8');

然后您可以通过索引查看和手动排列元素,例如 - 单精度(浮点)数据:

vec = typecast(bytevec(i1:i2), 'single');

然后在不改变数据值的情况下将其转换为默认的matlab double类型:

vec = cast(vec, 'double');

最后,您可以将原始向量重塑为 3d 矩阵:

M = reshape(vec, [d1, d2, d3]);

【讨论】:

  • 当我使用代码的第一行读取文件时... bytevec = 这只是导入二进制数据并以字节为单位显示大小,它说 411343976x1 双倍。我无法查看此数据,因此我不确定如何使用您的代码的下一部分。另外,使用 i1:i2 时出现未定义的变量错误。还有你为什么建议使用 uint8
  • fortran 代码写出以下内容,write(21) rtime,itime,dt,nx0,ny0,nz,deltax,deltay,rlenz,所以基本上我想要所有的值用于它们的后续标题进入他们的后续列
  • 您可以将来自bytevec 的字节视为从0 到255 的无符号整数。您应该将i1i2 变量定义为开始和结束字节位置(不包括具有固定长度的标头,如果您知道文件的二进制结构)。这意味着您应该知道所需的字节位置。当您调用typecast 时,它会将输入向量的大小减小 4(从 1 字节的 uint8 到 4 字节的浮点数)。
  • 要查看变量内容,请在工作区中双击它或从代码中选择它并按 Ctrl+D。
猜你喜欢
  • 2013-06-22
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多