Gnuplot:带有依赖循环索引的嵌套“plot”迭代(“plot for”)



我最近尝试使用gnuplot和plot for ...语法在一个图中简洁地绘制几个图。在这种情况下,我需要嵌套循环,因为我想将类似以下索引组合(此处简化)的内容传递给plot表达式:

  • i = 0j = 0
  • i = 1j = 0
  • i = 1j = 1
  • i = 2j = 0
  • i = 2j = 1
  • i = 2j = 2
  • 等等

所以i0循环到某个上限N,并且对于i的每次迭代,j0循环到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))

最新更新