Loops Gnuplot:Nested“;绘图”;具有相关循环索引的迭代(“;绘制”;)
我最近尝试使用gnuplot和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
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))