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

How to define and access array in GNUplot?

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

请提供简单的数组声明示例,在循环中为数组赋值。我认为这就足够了,我认为这对其他人也很有用。

(这个答案将在下一个稳定的 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"

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

如果您使用的是 Gnuplot 5.1 或更高版本并且需要一维数组,您只需定义大小为 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) 

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

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

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

"Multiply" array by 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函数。它也不限于整数索引。字符串也是可能的,它提供一些类似字典的行为。