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

ただし、結果が次のように表示されることを望みます。(目的の r(4):r(7) を 0 で埋めようとしているのではなく、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 ループも回避します。スキップする前に実行するループの数を特定できない場合は、2 つの異なるループを使用し、breakキーワードを使用して最初の反復を停止します。

于 2013-06-25T18:59:58.483 に答える