如何在GNUplot中定义和访问数组?

时间:2015-06-10 06:56:42

标签: arrays gnuplot

这是一个相当简单的问题,也可能是一个简单的问题。但我试图找到完成这些的方法,甚至在GNUplot文档中也找不到。可能是我的错误或误解了GNUplot中的array概念。我的问题是如何在GNUplot中定义和访问数组?

请提供简单的数组声明示例,分配数组循环的值。我觉得这已经足够了,我认为这对其他人也很有用。

3 个答案:

答案 0 :(得分:9)

如果你正在使用Gnuplot 5.1或者更高版本而需要一个1-d数组,你只需要定义大小为N的数组,记住索引从1到N:

gnuplot> array A[3] #Array definition
gnuplot> A[1]=2
gnuplot> A[3]=4
gnuplot> print A[1]
2
gnuplot> print A    #Print the array, with empty A[2]
[2,,4]

如果您需要多个维度或使用以前版本的Gnuplot,您可以执行以下操作:

由于在先前版本的Gnuplot中没有向量变量,因此可以定义两个函数来获取和设置值为包含索引的幕后变量的值。功能是:

aGet(name, i) = value(sprintf("_%s_%i", name, i)) 
aSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value)

要在阵列A上分配和检索值

eval aSet("A",2,3)
print aGet("A",2)

这些函数的作用是访问名为_A_2的变量。

您可以构建类似的函数来处理矩阵:

mGet(name, i, j) = value(sprintf("_%s_%i_%i", name, i, j)) 
mSet(name, i, j, value) = sprintf("_%s_%i_%i = %.16e", name, i, j, value) 

答案 1 :(得分:8)

(这个答案将在下一个稳定的gnuplot版本中过时,因为5.1开发树现在支持数组变量。)

" splot" gnuplot中的命令使用关键字" array"定义包含3D绘图函数值的NxM矩阵的大小。

程序员从C,Pascal,Python等知道的数组今天在gnuplot中不存在(gp5.0)。它们可能会在某一天实现,因为它们对于绘制具有任意(例如拟合)参数的曲线族非常有用。

如果你对gnuplot中的数组感到绝望,你可以(ab)使用word()函数(以及其他字符串函数)来实现有限的替代。它也有点麻烦:

array = ""
f(a,x) = a*x
do for [i=1:5] {array = array.sprintf(" %.3f",i+rand(0)) }
print "array = ".array
set xr [0:]; set yr [0:30]
plot for [i=1:5] f(word(array,i),x) title word(array,i)." x"

此示例将一组随机数写入名为" array"的字符串变量,然后使用它绘制五个使用" array"中的数字的线性函数。他们的坡度。

答案 2 :(得分:3)

受到@Karl的回答的启发,当将word函数放入另一个函数时,它看起来更像是一个数组:

array(n) = word("1 2 3 4 5 6 7 8 9", n)
print array(3)

这会打印3。所以索引是一个基础的。

"乘法" array乘以2:

print (b="", sum[i=1:9](b=b.(array(i)*2)." ", 0), b)

这会打印2 4 6 8 10 12 14 16 18。这里sum函数是(ab)用于遍历数组并忽略其结果。

这里的篇幅较短,通过@ bmello答案的不太通用的变体:

A_1=1.1; A_2=2.2; A_3=3.3
A(i) = value("A_".i)
print A(3)

对我而言,感觉更加直白。下划线_可以简单地看作set函数。它也不限于整数指数。字符串也可能产生类似字典的行为。