Octave算法循环迭代

时间:2014-10-09 10:40:01

标签: for-loop octave break

有人可以告诉我为什么这个Octave算法不执行i = 4和j = 2的最后一次迭代?它似乎受到内部for循环中的break条件的影响,但这不应该影响最后一次迭代。

x = [2, 3, 4];
h = [1, 2];
y = [0, 0, 0, 0];

for i = 1:4
    for j = 1:2
        printf("i = %d, j = %d\n", i, j);
        if((i-j < 0) || (i-j > 2)) break; endif
        y(i) = y(i) + h(j) * x(i-j+1);
    endfor
endfor

我在我的Debian系统上对它进行了测试,它在i = 4和j = 1时停止。输出为:

i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
i = 3, j = 1
i = 3, j = 2
i = 4, j = 1

3 个答案:

答案 0 :(得分:2)

你可能想要的是:

for i = 1:4
    for j = 1:2
        if ((0 <= i-j) && (i-j <= 2))
            printf("i = %d, j = %d\n", i, j);
            y(i) = y(i) + h(j) * x(i-j+1);
        endif
    endfor
endfor

for i = 1:4
    for j = 1:2
        if ((i-j < 0) || (i-j > 2)) continue; endif
        y(i) = y(i) + h(j) * x(i-j+1);
        printf("i = %d, j = %d\n", i, j);
    endfor
endfor

在你的代码中,当i == 4且j == 1时,语句

if((i-j < 0) || (i-j > 2)) break; endif

会跳出最里面的for循环。最外层的for循环已经完成(i == 4),程序结束。

参考文献:

答案 1 :(得分:1)

如果你打电话给“休息”,这同样是在“endfor”之后跳跃。因此,对于i = 4,j = 1(i-j)得到3,你称之为“break”而i = 4,j = 2永远不会运行。请参阅“继续”,因为我认为这就是您想要的。

答案 2 :(得分:0)

我用javascript运行你的脚本。在这里,我输出了你的病情结果。好像您编写的脚本按预期执行。

x = [2, 3, 4];
h = [1, 2];
y = [0, 0, 0, 0];
for(i=1; i<5;i++) {
 for(j=1;j<3;j++) {
   console.log('i'+i+" j"+j);
   console.log('i -j > 2 '+(i -j > 2));
   console.log('i-j < 0 '+(i-j < 0));
   if((i-j < 0) || (i -j > 2)) { break;}
   y[i] = y[i] + h[j] * x[i-j+1];
 }
}

在Chrome控制台中执行它以验证您的案例。