1

我有一个我创建的数组,大小为:256^3。

real*8, dimension(256,256,256) :: dense

open(unit=8,file=fname,form="unformatted")
write(8)dense(:,:,:)
close(8)

写出来以便 Matlab 可以读取它的最佳方法是什么?我有一些我想使用的后期处理。

我正在使用 gfortran,所以我不能使用二进制格式:{ 这是真的吗?我将表单设置为“二进制”,但它无法识别它。我也没有安装ifort。

4

2 回答 2

3

使用未格式化的流访问将数组写出。流访问是二进制的标准等价物。从 IRO-bot 的答案中窃取:

real(kind=kind(0.0d0)),dimension(256,256,256) :: dense

open(unit=8,file='test.dat',& ! Unformatted file, stream access
  form='unformatted',access='stream')
write(unit=8) dense           ! Write array
close(unit=8)
end

这很可能足以满足您的需求。但请注意,对于更复杂或更复杂的输出要求,Matlab 带有一个可从编译语言调用的例程库,允许您编写 .mat 文件。还存在其他可以促进这种数据传输的库 - 例如 HDF5。

于 2012-12-07T04:49:45.720 回答
0

stream是的,您可以按照 IanH 的建议使用两种访问方式编写二进制文件,或者direct访问:

integer :: reclen
real(kind=kind(0.0d0)),dimension(256,256,256) :: dense

inquire(iolength=reclen)dense ! Inquire record length of the array dense
open(unit=8,file='test.dat',& ! Binary file, direct access
     form='unformatted',access='direct',recl=reclen)
write(unit=8,rec=1)dense      ! Write array into first record 
close(unit=8)

end

Unless you specify access attribute in the open statement, the file will be opened in sequential mode, which may be inconvenient for reading because it adds a padding to each record which contains information about record length. By using direct access, you are able to specify the record length explicitly, and in this case, the size of the file written will be exactly 8*256^3, so assuming you know the array ordering and endianness, you are able to read it from your MATLAB script.

于 2012-12-07T06:17:09.113 回答