这是一个相当简单的问题,也可能是一个简单的问题。但我试图找到完成这些的方法,甚至在GNUplot文档中也找不到。可能是我的错误或误解了GNUplot中的array
概念。我的问题是如何在GNUplot中定义和访问数组?
请提供简单的数组声明示例,分配数组循环的值。我觉得这已经足够了,我认为这对其他人也很有用。
答案 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函数。它也不限于整数指数。字符串也可能产生类似字典的行为。