2011-10-19 24 views
7

MATLABでは、次のforループがあります。forループは反復しません

for i = [1:100]' 
    %'// Do something, such as disp(i) 
end 

は実際には反復処理で実際には実装されていませんが、iは行列[1 2 3 ... 100]になり、 "loop" i。これを確認するには、iの値またはその他のトラッキング情報を出力します。ループを通過するのは1回だけです。

MATLABに本物のループを強制することは可能ですか?私が尋ねる理由は、上記のアプローチは多くのケースでうまくいくが、実行する必要があるネストループがあるときははるかに痛いということです。


次のコードは、実際にループを繰り返していると思われる場合は期待したことができません:

for i = outlier 
    data(i) = median(data(i-100:i+100)) 
end 

これは、 data(i)をi-100からi + 100までのデータの中央値と比較しますが、一致しません。実際、中央値は、あなたが気にしているすべての範囲の集合体で計算された単一の値を返し、すべてのデータ(i)点がその単一の値に置き換えられます。

+2

あなたが見ているものを再生し、出力を投稿することができます。私はこの振る舞いを見たことがなく、私はMatlabのforループに多くの注意を払ってきました。 – Iterator

+0

中央値(データ(i-100:i + 100))を意味しないのですか? ( ':'付き) –

+0

@Clement J.はいそうです。今修正されました。 –

答えて

12

あなたは

for i = (1:100)' %'# square brackets would work as well 
    doSomething 
end 

を記述する場合、ループが(それがで200回反復されるすべての列等号の右側にあるものは何でもの以上for - ループ反復処理しているので、一度だけ実行されます等号の右側に100×200の配列)。

ただし、この例では、i=[1:100]があり、行ベクトルと評価されます。したがって、ループは100xを実行する必要があります。

あなたがnx1代わりの1xnかもしれない配列を反復した場合、あなたは、安全上の理由から、書き込みができます。

for i = myArray(:)' %'# guarantee nx1, then transpose to 1xn 
end 
+1

+1。最後の段落を除いて: 'i = [1:100]'(OPの擬似コードのような)ループは100回実行されます。 –

+0

@AndrewJanke:D'oh!ミスタイプ! – Jonas

7

これは正しくありません。コード:

for i=1:100 
    disp(i) 
end 

すべての値が1から100まで連続して印刷されます。 Matlabはベクトル化を奨励していますが、上で使用したコーディングのスタイルで伝統的なループを使用することは間違いありません。

+0

+1良い答え。 :)私は、OPで記述された動作を見たことがない、と私は繰り返しに注意を払う(ユーザー名に注意してください...)。私は報告された行動の裏に何があるのか​​分からない。 – Iterator

+5

彼の「外れ値」変数は列ベクトルであってもよい。 Matlabのforループは、要素ではなく何かの列を反復処理します。 [1:100]のような行ベクトルの場合は同じことです。 'i = [1:100] 'の場合は、1回のパスを行います。 –

+1

@Iterator:配列が1xnではなくnx1である場合の動作です。 – Jonas

関連する問題