2011-10-19 276 views
7

在MATLAB以下for循環:for循環不迭代

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

顯然不是真的被迭代執行,而i成爲矩陣[1 2 3 ... 100]和「循環「僅在該矩陣i上執行一次。您可以通過打印i的值或其他跟蹤信息來驗證。循環中只有一次通過。

是否有可能迫使MATLAB做真正的循環?我問的原因是上面的方法在很多情況下都很好,但是當你有需要運行的嵌套循環時更加痛苦。


下面的代碼不會做,如果你以爲你是在一個循環得到實際的迭代你所期望的:

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

人們期望在每個離羣指數,這將取代數據(i)與從i-100到i + 100的數據的中位數,但它不是。事實上,中位數會返回您所關注的所有範圍的集合中計算出的單個值,並且每個數據(i)點將被替換爲該單個值。

+2

你能後輸出再現您所看到的。我還沒有看到這種行爲,並且我在Matlab中已經注意到了很多循環。 – Iterator

+0

你不是指'中位數(數據(i-100:i + 100))'嗎? (帶':') –

+0

@Clement J.是的。現在更正。 –

回答

12

如果你寫

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

循環只執行一次,因爲for -loop遍歷所有列無論是等號右邊(它會重複使用200次等號右邊的100乘200陣列)。

但是,在你的例子中,你有i=[1:100],它的計算結果是一個行向量。因此,循環應執行100倍。

如果您遍歷數組,可能是nx1,而不是1xn,就可以了,爲了安全起見,寫:

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

+1。除了最後一段:'i = [1:100]'循環(就像在OP的僞代碼中一樣)執行100次,而不是一次。 –

+0

@AndrewJanke:哦!輸錯! – Jonas

7

這是不正確的。代碼:

for i=1:100 
    disp(i) 
end 

將連續打印所有值1到100。雖然Matlab確實鼓勵矢量化,但您可以絕對使用上面使用的編碼風格的傳統循環。

+0

+1更好的答案。 :)我從來沒有見過OP描述的行爲,並且我非常關注迭代(注意用戶名...)。我不確定報道的行爲可能存在什麼後果。 – Iterator

+5

他的'outlier'變量可能是一個列向量。 Matlab for for循環遍歷某些東西的列,而不是元素。對於像[1:100]這樣的行向量,它是同樣的事情;但是'因爲我= [1:100]''會做一次傳球。 –

+1

@Iterator:如果數組是nx1而不是1xn,則會發生此行爲。 – Jonas