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

fro*_*hem 10 arrays gnuplot

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

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

Kar*_*arl 9

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

gnuplot中的"​​splot"命令使用关键字"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"
Run Code Online (Sandbox Code Playgroud)

此示例将一组随机数写入名为"array"的字符串变量,然后使用它绘制五个线性函数,这些函数使用"数组"中的数字作为其斜率.


bme*_*llo 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]
Run Code Online (Sandbox Code Playgroud)

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

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

aGet(name, i) = value(sprintf("_%s_%i", name, i)) 
aSet(name, i, value) = sprintf("_%s_%i = %.16e", name, i, value)
Run Code Online (Sandbox Code Playgroud)

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

eval aSet("A",2,3)
print aGet("A",2)
Run Code Online (Sandbox Code Playgroud)

这些函数的作用是访问名为_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) 
Run Code Online (Sandbox Code Playgroud)


小智 6

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

array(n) = word("1 2 3 4 5 6 7 8 9", n)
print array(3)
Run Code Online (Sandbox Code Playgroud)

这打印3. 所以索引是基于一个的。

“乘以” array2:

print (b="", sum[i=1:9](b=b.(array(i)*2)." ", 0), b)
Run Code Online (Sandbox Code Playgroud)

这打印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)
Run Code Online (Sandbox Code Playgroud)

对我来说,感觉更直观。下划线_可以简单地看作是 set 函数。它也不限于整数索引。字符串也是可能的,它提供了一些类似字典的行为。