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

时间:2015-12-16 17:55:22

标签: loops for-loop gnuplot

我最近尝试使用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的每次迭代,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,因为它会让事情变得更加复杂。

1 个答案:

答案 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))