Loops Gnuplot:Nested“;绘图”;具有相关循环索引的迭代(“;绘制”;)

Loops Gnuplot:Nested“;绘图”;具有相关循环索引的迭代(“;绘制”;),loops,for-loop,gnuplot,Loops,For Loop,Gnuplot,我最近尝试使用gnuplot和plot for…语法在绘图中简洁地绘制几个图形。在本例中,我需要嵌套循环,因为我希望将类似以下索引组合(此处简化)的内容传递给绘图表达式: 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我把你的问题当成了个人问题。对于你的特定问题,你可以使用数学技巧。将你的指数(i,j)重新映射到单个指数k,这样 (0,0) -> (0) (1,0

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

  • 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我把你的问题当成了个人问题。对于你的特定问题,你可以使用数学技巧。将你的指数(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))

不,没有简单的方法。这就是为什么我在你链接到的答案中提出了丑陋的解决方法;)@Christoph对于这个具体的案例,我在下面的答案中找到了很好的解决方法。@Miguel的确,:)+1当然,从数学角度来看,这不是一个真正的“简单”解决方案,但是它确实允许人们使用简单的
绘图进行…
语法,而不必处理
多点
或其他gnuplot复杂问题。而且,它不容易扩展到其他索引以不同方式相互依赖的情况。但我相信你知道;-)因此,我猜答案是“不,不是没有转换索引或其他解决方法。”这很简单,因为表达式简短而透明。得到表达式需要更多的工作,所以是的,你是对的。这只是一个具体情况的解决方案,它依赖于可以获得映射反演的解析表达式这一事实。对于一般情况,我将使用Christoph答案中给出的解决方案的变体(您在问题中链接的那个)。
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))