如何在 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文件中的数据存储在uint16或uint8中,整数个数是已知的。 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章