所以,我用fortran创建了一个二进制文件,使用了类似的东西:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
按照我的理解,fortran在文件的两端加上4个字节,剩下的就是我想要的数据(在本例中,是1000个双字节的列表)。
我想用gnuplot来读这篇文章,但是,我不知道如何让gnuplot跳过第一个和最后4个字节,并将其余部分作为双字节来读。文档在这方面帮助不大。
感谢
Andrew:我认为没有理由让gnuplot处理数据前后的额外字节。要么Fortran不做这种填充,要么它做了,gnuplot可以轻松地处理它。
我也遇到过类似的问题,谷歌搜索总是让我回到这里。我想我最好发布我的解决方案,以防其他人也遇到同样的情况。
我一直在尝试使用gnuplot的"plot'file.dat'matrixwithimage"命令绘制2D颜色图。我的ASCII输出文件太大,所以我想使用二进制文件。我所做的事情如下:
在fortran中:
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似乎可以读取数据,而不需要额外的数据字节。
使用直接I/O而不是顺序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
使用gnuplot 5.0测试,以下是大小为N
、的双数组x
的fortran非格式化数据写入
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
的意思是,跳过一个四字节整数,有效地跳过了环绕输出的页眉和页脚数据。
有关更复杂数据的更多信息和外推,请参阅二进制的gnuplot 5.0文档,并参阅show datafile binary datasizes
的格式大小。然而,请注意,多列数据(即每次写入N倍)可以用与上述相同的格式访问,但访问方式为%Ndoubles
,其中N是整数。然后以using 1:3
为例,绘制第一列与第三列的对比图。