And*_*ott 6 fortran binaryfiles gnuplot binary-data
所以,我用fortran创建了一个二进制文件,使用类似的东西:
open (3,file=filename,form="unformatted",access="sequential")
write(3) matrix(i,:)
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,fortran在文件的两端填充4个字节的文件,其余的只是我想要的数据(在这种情况下,1000个双打的列表).
我想用gnuplot读取这个,但是,我不知道如何让gnuplot跳过第一个和最后4个字节,并将其余部分读作双打.在这方面,文档不是很有用.
谢谢
安德鲁:我认为没有理由让gnuplot在数据之前/之后处理那些额外的字节.Fortran不会做这个填充,或者确实如此,gnuplot没有麻烦地处理它.
我遇到了类似的问题,谷歌的搜索总是让我回到这里.我想我最好发布我的解决方案,以防其他人发生同样的情况.
我一直在尝试使用gnuplot的"plot'file.dat'matrix with image"命令制作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' )
Run Code Online (Sandbox Code Playgroud)
在gnuplot中:
plot 'out.dat' binary array=128x128 format="%float" with image
Run Code Online (Sandbox Code Playgroud)
笔记:
默认情况下,gnuplot假定二进制文件中具有单精度.如果您的fortran程序以双精度输出,只需将"%float"更改为"%double"即可.
我的程序在数组中使用了双精度数据,但输出文件太大了.由于基于双精度或单精度的图像无法与眼睛区分,并且双精度数据文件很大,因此我将双精度数据转换为单精度数据,然后再将其写入文件.
您可能必须根据要对矩阵执行的操作来调整gnuplot命令,但这会将其加载并绘制好.这就是我需要它做的事情,我希望它可以帮助
其他有类似问题的人.
正如您所看到的,如果Fortran在数据之前/之后添加了额外的字节,gnuplot似乎会读入数据而不会考虑这些额外的字节.
使用直接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,:)
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
或逐行:
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
Run Code Online (Sandbox Code Playgroud)
或元素:
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
Run Code Online (Sandbox Code Playgroud)
或转储整个矩阵:
inquire (iolength = irec) matrix
open (3, file=filename, form="unformatted", access="direct", recl=irec)
write(3, rec=1) matrix
Run Code Online (Sandbox Code Playgroud)
使用 gnuplot 5.0 进行测试,以下 fortran 未格式化数据写入x
大小为 double 的数组N
,
open(FID,file='binaryfile')
do k = 1, N
write(FID) x(k)
end do
close(FID)
Run Code Online (Sandbox Code Playgroud)
gnuplot 可以通过以下方式理解:
plot 'binaryfile' binary format="%*1int%double%*1int"
Run Code Online (Sandbox Code Playgroud)
这%*1int
意味着,跳过一个四字节整数,有效地跳过头和脚数据 fortran 环绕输出。
有关更复杂数据的更多信息和外推,请参阅关于二进制的 gnuplot 5.0 文档,并查看带有, 的格式的大小show datafile binary datasizes
。但是请注意,可以使用与上述相同的格式访问多列数据(即每次写入 N 双),但%Ndoubles
其中 N 是整数。然后,using 1:3
例如,将第一列与第三列作图。
归档时间: |
|
查看次数: |
5084 次 |
最近记录: |