防止gnuplot评估每个数据点的功能

时间:2014-05-15 07:24:13

标签: gnuplot

我遇到了一些执行时间很长的gnuplot plot命令。基本上,当您使用数据文件执行以下操作时:

f(x) = sin(x) # for example!
plot "data" u ($1-f($1)):2
将针对要绘制的每个数据点评估

f($1)。现在,我有一个外部功能:

a(i) = real(system(sprintf("awk 'NR==1 {print $6}' dos_%i", i)))

其中dos_1dos_2等不同是我的数据文件。此函数返回从每个文件中读取的实数。

问题是当在plot命令中使用此函数时,请说

plot "dos_1" u ($1+a(1)):2

将为每个数据点评估函数a(1),即使它没有改变。这可以花费很多次,因为它是一个调用外部命令的函数。现在,有人可能(理所当然地)建议如果(1)没有改变,我使用常数:

a1 = a(1)
plot "dos_1" u ($1+a1):2

执行得相当快,并给出相同的结果。我的问题是我必须绘制许多文件:

plot for [i=1:agazillion] "dos_".i u ($1+a(i)):2

永远不会结束。

如何将函数值的存储(和使用)自动化到静态变量(或更轻的函数)上,如下所示:

for [i=1:agazillion] "a".i = a(i) # This doesn't work!!!
plot for [i=1:agazillion] "dos_".i u ($1+"a".i):2 # This doesn't work either!

要复杂化,我可以访问的最新gnuplot是4.4。 (还请建议适用于更高版本的解决方案,但它们仅适用于更高版本。)

想法?

1 个答案:

答案 0 :(得分:1)

我所知道的唯一“结构”是使用单词列表来存储值。对文件的迭代必须使用bash完成,因为版本4.4只能在一个绘图调用中循环,而不能在do for ...中循环:

a_values = system("for file in dos_*; do awk -v ORS=' ' 'NR==1 {print $6}' $file; done")

plot for [i=1:words(a_values)] "dos_".i u ($1+word(a_values, i)):2

我测试了这个以使用4.4.4。