我最近尝试使用gnuplot和plot for ...
语法在一个图中简洁地绘制几个图形。在这种情况下,我需要嵌套循环,因为我想将类似以下索引组合(此处简化)的内容传递给plot
表达式:
i = 0
,j = 0
i = 1
,j = 0
i = 1
,j = 1
i = 2
,j = 0
i = 2
,j = 1
i = 2
,j = 2
所以i
从0
循环到某个上限N
,并且i
的每次迭代,j
循环从0
到{ {1}}(所以i
)。我试着这样做:
i <= j
但每次只有# f(i, j, x) = ...
N = 5
plot for [i=0:N] for [j=0:i] f(i, j, x) title sprintf('j = %d', j)
的五次迭代(如j = 0
所示)。因此,gnuplot似乎只评估title
个表达式一次,在开始时修复for
而不是重新评估以跟上更改i = 0
值。这样的事情已经在this answer中被暗示(“在i
结构中,第二个索引不能依赖于第一个索引。”)。
是否有一种简单的方法可以在gnuplot中执行我想要的操作(即使用上面给出的某种循环的索引组合)?自gnuplot 4.6以来有plot for ...
结构,但是它需要在其主体中使用单独的语句,因此它不能用于组合单个do for { ... }
语句。我想可以使用plot
来解决这个问题,但如果可能的话,我想避免使用multiplot
,因为它会让事情变得更加复杂。
答案 0 :(得分:1)
我亲自接过你的问题。对于您的具体问题,您可以使用数学技巧。将索引(i,j)重新映射到单个索引k,例如
(0,0) -> (0)
(1,0) -> (1)
(1,1) -> (2)
(2,0) -> (3)
...
可以证明i和j与k之间的关系是
k = i*(i+1)/2 + j
可以用一些代数反转
i(k)=floor((sqrt(1+8.*k)-1.)/2.)
j(k)=k-i(k)*(i(k)+1)/2
现在,您可以在循环中使用单个索引k
N = 5
kmax = N*(N+1)/2 + N
plot for [k=0:kmax] f(i(k), j(k), x) title sprintf('j = %d', j(k))