所以,我用fortran创建了一个二进制文件,使用类似的东西:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
我理解它的方式,fortran在文件的两端填充4个字节的文件,其余的只是我想要的数据(在这种情况下,是1000个双打的列表)。
我想用gnuplot读取这个,但是,我不知道如何让gnuplot跳过第一个和最后4个字节,并将其余部分读作双打。在这方面,文档不是很有用。
由于
答案 0 :(得分:8)
Andrew:我认为没有理由让gnuplot在数据之前/之后处理那些额外的字节。 Fortran不会做这个填充,或者它确实和gnuplot没有麻烦地处理它。
我遇到了类似的问题,谷歌的搜索总是让我回到这里。我想我最好发布我的解决方案,以防其他人发生同样的情况。
我一直在尝试使用gnuplot的“plot'file.dat'matrix with image”命令制作2D色彩图。我的ASCII输出文件太大了,所以我想改用二进制文件。我做的是以下内容:
在堡垒中:
implicit none
real, dimension(128,128) :: array
integer :: irec
! ... initialize array ...
inquire( iolength=irec ) array
open( 36, 'out.dat', form='unformatted', access='direct', recl=irec )
write( 36, rec=1 ) array
close( 36, status='keep' )
在gnuplot中:
plot 'out.dat' binary array=128x128 format="%float" with image
注意:
默认情况下,gnuplot假定二进制文件中具有单精度。如果你的 fortran程序以双精度输出,只需更改“%float” 为“%双倍”。
我的程序在数组中使用了双精度数据,但输出文件 太大了由于基于双精度或单精度的图像是 无法区分,双精度数据文件 很大,我将双精度数据转换为单精度数据 在将其写入文件之前。
您可能需要根据内容调整gnuplot命令 你想要使用矩阵,但是这会加载它并绘制它 好。这就是我需要它做的事情,我希望它可以帮助任何人 否则谁有类似的问题。
如您所见,如果Fortran在数据之前/之后添加额外的字节, gnuplot似乎读取了数据而没有让你更多地接受这些 字节考虑在内。
答案 1 :(得分:6)
使用直接I / O而不是顺序可能更容易:
inquire (iolength = irec) matrix(1,:) !total record length for a row
open (3, file=filename, form="unformatted", access="direct", recl=irec)
write(3, rec=1) matrix(i,:)
inquire
语句以“recl”为单位显示输出列表的长度。因此,整个列表适合长度为irec
的一条记录。
为了将列矩阵写入文件,您可以执行以下操作:
inquire (iolength = irec) matrix(:,1)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do i=1,ncol
write(3, rec=i) matrix(:,i)
end do
或逐行:
inquire (iolength = irec) matrix(1,:)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do i=1,nrow
write(3, rec=i) matrix(i,:)
end do
或逐个元素:
inquire (iolength = irec) matrix(1,1)
open (3, file=filename, form="unformatted", access="direct", recl=irec)
do j=1,ncol
do i=1,nrow
write(3, rec=j+(ncol-1)*i) matrix(i,j)
end do
end do
或转储整个矩阵:
inquire (iolength = irec) matrix
open (3, file=filename, form="unformatted", access="direct", recl=irec)
write(3, rec=1) matrix
答案 2 :(得分:4)
使用gnuplot 5.0进行测试,以下fortran无格式数据写入大小为x
的双数组N
,
open(FID,file='binaryfile')
do k = 1, N
write(FID) x(k)
end do
close(FID)
gnuplot可以通过以下方式理解:
plot 'binaryfile' binary format="%*1int%double%*1int"
%*1int
表示,跳过一个四字节整数,有效地跳过页眉和页脚数据fortran包裹输出。
有关更复杂数据的更多信息和推断,请参阅二进制文件中的gnuplot 5.0文档,并使用show datafile binary datasizes
查看格式的大小。但是请注意,可以使用与上述相同的格式访问多列数据(即每次写入的N倍数),但是作为%Ndoubles
,其中N是整数。然后以using 1:3
为例,可以将第一列绘制为第3列。