7

在 Matlab 中,我在 for 循环期间执行计算,但如果满足某些条件,我试图找到一种在 for 循环期间跳过迭代的方法。我写了一个简单的例子来说明我的问题。

在下面的代码中,for 循环将通过迭代 1 和 2 并按预期输出到 r。r(1) 将是 1,r(2) 将是 2。一旦 for 循环运行通过迭代 3,20 的值将被放入 r(3)。在这发生之后,我希望 for 循环跳过接下来的 5 次迭代并直接进入 for 循环的第 8 次迭代。

for i=1:1:10
    if i==3
        r(i)=20;
        i = i+5;
    else
        r(i) = i;
    end
end

r 的实际结果如下:

r =

 1     2    20     4     5     6     7     8     9    10

但是,我希望结果类似于以下内容。(请注意,我不希望用 0 填充所需的 r(4):r(7),而是希望完全跳过循环迭代 4 到 7。)

r =

 1     2    20     0     0     0     0     8     9    10

如果有人有建议,将不胜感激。谢谢!

4

3 回答 3

7

使用while循环而不是for循环手动增加它:

i=1;  // index for loop
k=1;  // index for r
r = zeros(1,10) // pre-allocate/cut is faster
while i <= 10
  if i == 3
    r(i)=20;
    i = i+5;  // skip multiple iterations
  else
    r(k)=i; 
    i=i+1;    // loop increment
    k=k+1;    // vector increment
  end
end
r(k+1:end) = []; // Remove unused portion of the array
于 2013-06-25T18:59:37.377 回答
2

最基本的实现是从循环中省略那些。

for i=  [1:3 8:10]
   if i==3
       r(i)=20;
   else
       r(i) = i;
   end
end

但是,如果您确实需要动态确定循环索引,那可能无法满足您的需求。在这种情况下,请使用 while 循环,如下所示:

i = 1;
while i <= 10
   if i==3
       r(i)=20;
       i = i+5;
   else
       r(i) = i;
       i = i+1
   end

结尾

如您所见,当您尝试在 for 循环中更改索引变量时会出现问题。

于 2013-06-25T18:56:35.470 回答
0

如果你知道在哪里跳过你可以做类似的事情

ind = [1:2,8:10]
r(ind) = ind
r(3) = 20

这样你也可以避免 for 循环。如果您无法确定在跳过之前执行了多少个循环,请使用两个不同的循环并使用break关键字来停止第一次迭代。

于 2013-06-25T18:59:58.483 回答