如何在 Fortran 程序中读取 .raw 文件?

Posted

技术标签:

【中文标题】如何在 Fortran 程序中读取 .raw 文件?【英文标题】:How can I read a .raw file in a Fortran program? 【发布时间】:2018-04-26 02:21:21 【问题描述】:

我正在使用 Fortran 中的旧有限元代码。这是大学的一个研究项目。

我有一个 .raw 文件,它表示 3D 图像。

.raw文件中的数据存储在uint16uint8中,整数个数是已知的。 p>

如何在 Fortran 程序中将此图像读取到整数数组中?

类似的东西

allocate(imgarray(total_int))
call raw2array(filename,imgarray)

我目前正在使用 python 来读取图像,并将其转换为整数向量。这个向量是在 Fortran 中用一个文本文件读取的。

在 python 中

imgarray = np.fromfile(fid, dtype=np.uint16,count=total_int,sep='')

但是当读取超过 1000x1000x1000 个整数的文件时,这个过程会变得非常缓慢。

该项目要求图像 .raw 以二进制形式读取,在 Fortran 程序中作为完成向量的子例程。

如何读取这个图像(二进制)并使用 Fortran 中的子程序将其转换为整数向量?

【问题讨论】:

但是当读取超过 1000x1000x1000 整数的文件时,这个过程会变得非常慢。我严重怀疑在 Fortran 中读取会更快。 你有什么尝试吗?你有我们可以构建的代码吗?文件是 Fortran 顺序还是 C 顺序?了解 Fortran 中的 访问。 @VladimirF 其实代码在F90,我错了,因为我看到程序是用gfortran编译的,用mpi77链接的。代码的非并行版本在F77中。 不要发布任何链接,这里显示相关代码。您有没有做任何事情,或者您只是想从我们这里获得完整的解决方案?您知道一般如何从 Fortran 中的外部文件中读取数据吗?您需要在此处获得 stream 访问权限。然后它可以是单个read 语句。试着自己做点什么。作为流打开并执行read(unit) imgarray。报告发生了什么。 @VladimirF 感谢您的指导。我不希望任何人提供完整的解决方案。 【参考方案1】:

如果您的编译器支持 16 位整数和流访问,那么就这么简单

   use iso_fortran_env
   implicit none
   integer(kind=INT16), allocatable::m(:,:,:)
   allocate(m(1000,1000,1000))
   open(100,file='test.raw',access='stream')
   read(100)m
   end

【讨论】:

感谢这项工作,通过一些小改动我可以读取 .raw 文件。 这两种情况的性能非常相似。对于 128x128x128 (uint16) 的图像,python 和 fortran 都需要 1 秒。对于 288x288x300 (uint8) python 的图像,fortran 11 需要 12 秒。【参考方案2】:

根据@agentp给出的解决方案,.raw文件在数组中被读取为:

use iso_fortran_env
implicit none
integer(kind=INT16), allocatable::m(:)
integer total_int
total_int = 1000*1000*1000
allocate(m(total_int))
open(100,file='test.raw',access='stream')
read(100)m

【讨论】:

以上是关于如何在 Fortran 程序中读取 .raw 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在fortran中读取和连接文件

Fortran 无法从文件中读取

fortran 文件读写顺序

如何使用fortran读取不规则行

从fortran文件中读取变量

在 Fortran 中读取浮点数时出错