2014-10-09 54 views
1

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

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系统上,它停在我= 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 

回答

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 

在你的代码,当我== 4和j == 1的声明

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

跳跃走出最内层的循环。最外面的for循环已经完成(i == 4)并且程序结束。

参考文献:

+0

这个答案非常明确和有帮助。伟大的工作和+1的替代方式做到这一点。先生,祝你好运!不幸的是,我没有足够的积分来投票。 – 2014-10-09 11:08:20

1

如果你所说的“破发”,这同样是对在“endfor”之后跳跃。所以对于i = 4,j = 1(i-j)得到3,你称之为“break”,i = 4,j = 2永远不会运行。看到“继续”,因为我认为这是你想要的。

+0

啊,好极了!我的确打算执行继续声明。我猜我被它的工作情况i = 1,j = 2(其中i-j = -1)所迷惑,因为它是在内部for循环迭代的末尾。非常感谢! – 2014-10-09 11:02:25

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控制台中执行它以验证您的案例。

+0

是的,我打算使用continue语句而不是中断。感谢您检查,但! – 2014-10-09 11:09:55