我遇到了一些执行时间很长的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_1
,dos_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。 (还请建议适用于更高版本的解决方案,但州它们仅适用于更高版本。)
想法?
答案 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。