在gnuplot上查看来自fortran的二进制输出

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个字节,并将其余部分读作双打.在这方面,文档不是很有用.

谢谢

jvr*_*sem 8

安德鲁:我认为没有理由让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似乎会读入数据而不会考虑这些额外的字节.


ste*_*ert 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,:)
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用填充读取二进制数据" (3认同)

HAL*_*001 5

使用 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例如,将第一列与第三列作图。