我最近尝试使用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
循环到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)
但这每次仅给出具有CCD_ 23的五次迭代(如CCD_。因此,gnuplot似乎只对for
表达式求值一次,在开始时固定了i = 0
,而没有重新求值以跟上i
值的变化。这个答案中已经暗示了类似的东西("在plot for ...
结构中,第二个索引不能依赖于第一个索引。")
有没有一种简单的方法可以在gnuplot中实现我想要的功能(即使用上面给出的索引组合和某种循环)?自gnuplot 4.6以来就有了do for { ... }
结构,但这需要在其主体中使用单独的语句,因此它不能用于组装单个plot
语句。我想人们可以使用multiplot
来解决这个问题,但如果可能的话,我希望避免使用multiplot
,因为它会使事情变得比看起来必要的更复杂。
我认为你的问题很私人。对于你的具体问题,你可以使用数学技巧。将索引(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))