2015-06-01 73 views
0

例子:(實際的代碼很長可在編輯歷史中找到)動態檢查條件迭代在for循環 - 我的代碼MATLAB

X = {'a','b','c','d'} 

for i = 1:length(X) 
    if X(i) == 'a' %// for example 
      X(i)=[]; 
    end 
end 

爲什麼沒有計數器停止在第三次迭代?它試圖繼續進行到第4次迭代,並生成以下錯誤:

索引超出矩陣的維數。

但是當第一個元素'a'被刪除時,數組的實際大小變爲3(而不是4)。第三次迭代後不應該停止「循環」嗎?

+0

我不現在有matlab,但我會檢查,今晚,有趣...;) –

+0

region_L的長度是多少? – GameOfThrows

+0

之前的循環長度(region_L)= 11 – Devel

回答

3

你大概的意思

X = ['a','b','c','d'] 

(方括號),所以X是一個字符數組(串),而不是一個單元陣列


的問題是,在循環中刪除一個條目X,所以X剩下3條目。因此,當您嘗試訪問其4 th條目(在迭代i=4)時,您會收到錯誤消息。

發生這種情況的原因是for退出條件是在每次迭代都沒有重新評估。在for聲明你說i必須從144length(X)在那個時候的值),這就是發生了什麼。

要達到你想要的效果,你可能需要一個while循環。while環回條件爲在每次迭代之後使用變量的當前值來評估是否應該進行新的迭代。因此,在下面的代碼只出現3迭代,你會得到任何錯誤:

i = 1; 
while i<=length(X) 
    if X(i) == 'a' 
     X(i) = []; 
    else 
     i = i + 1; 
    end 
end 

計數器i應該只有在沒有X元素已被刪除遞增。感謝@matlabgui的收穫。

+0

謝謝你,你的想法是最好的,沒有衝突了 – Devel

+0

@LuisMendo你需要在' X(i)= []' - 考慮'X = ['a''a''c''d']' – matlabgui

+1

@matlabgui的情況謝謝!你是對的,我沒有想到這一點。我編輯了答案。現在我只有在沒有元素被移除的情況下才增加計數器'i'。我認爲這與「繼續」是一樣的,但我覺得它更清晰。 –

0

MATLAB數組以1 開頭,然後你必須減少循環的結尾,因爲你的vektor變小或得到第二個變量。

我是不是能夠比較字符。但隨着數字它的工作

所以這將是

j=0 
for i = 1:length(X) 
    j=j+1; 
    if X(j) == 'a' %for example 
      X(j)=[]; 
      j=j-1; 
    end 
end 
0

因爲任何陣列的Matlab的指數從1開始,你會得到錯誤,並你做了for循環從0開始。

+1

對不起,這是0這是一個打字錯誤 – Devel

0

我不能重新創建問題,代碼使用單元格,而且不能索引第0個單元格。所以,我編輯的代碼看起來是這樣的:檢測

for i = 1:length(X) 
    if X{i} == 'a' %for example 
     X{i}=[]; 
    end 
end 

>>X = 

[] 'b' 'c' 'd' 

沒有問題

編輯:根據你的代碼,而運行該循環要刪除的細胞;嘗試刪除單元格中的值而不是刪除單元格,要使用大括號{}而不是[],並且如果要刪除空單元格,只需在末尾使用:

X(~cellfun('isempty',X)) 
+0

你是對的,但我有更復雜的代碼我嘗試用簡單的代碼解釋(我會編輯並把我的代碼也許你會看到問題)謝謝 – Devel

+0

@Devel我編輯了我的答案,請檢查它是否有任何區別 – GameOfThrows

1

我懷疑你的代碼是:

X={'a','b','c','d'} 

for i = 1:length(X) 
    if X{i} == 'a' %for example 
      X(i)=[] 
    end 
end 

X{i} ==「A」要卸下X(i) - >即X變成3長,而不是4。但是你循環編程去的長度X開始前(即4)。

在這種類型的情況下可以做在反向循環:

X={'a','b','c','d'} 

for i = length(X):-1:1 
    if X{i} == 'a' %for example 
      X(i)=[] 
    end 
end 

另一種方法是存儲一個inedx在循環,然後在端部除去:

X={'a','b','c','d'} 

index = false(length(X),1); 
for i = 1:length(X) 
    if X{i} == 'a' %for example 
      index(i)= true; 
    end 
end 
X(index) = []; 
+0

是的,這正是問題所在,但我必須以正確的方向開始循環:for i = 1:length(X) – Devel