2011-08-31 95 views
1

我正試圖找到一種更好的方法來刪除某些包含零的向量中的行。我現在正在做的是下面的代碼:刪除包含零的行

i = 1; 
while i <= length(JAbs) 
    if JAbs(i) == 0 
     JAbs(i) = []; 
     JX(i) = []; 
    else 
     i = i+1; 
    end 
end 

我想有一個更簡單的方法,將不勝感激任何幫助。

最好的問候, 阿希姆

+2

可能重複(HTTP://計算器。 com/questions/738438 /從-a-matrix-removing-sparse中刪除零) – Jonas

+0

沒有重複,因爲我的問題是如何做到這一點不僅對於一個向量,而是對於多個向量w這裏需要刪除同一行。請參閱我的示例代碼,其中JAbs和JX都將行刪除。 – Achim

+0

它仍然是相同的操作,除了兩個向量:'goodRows = JAbs〜= 0; JAbs = JAbs(goodRows); JX = JX(goodRows);' – Jonas

回答

5
  1. 學習使用矢量操作。
  2. 學會避免循環,尤其是糟糕的循環可能會導致數組在每次傳遞中的大小。
  3. 學會使用布爾索引而不是查找。它更快。

    X(X == 0)= [];

+0

+1 informative ... – posdef

+0

此代碼不保留矩陣形式。它使一個長線輸出?爲什麼? – bordart

0

具有u嘗試過的 「查找」 命令? Documentation from MathWorks

+0

posdef:謝謝。現在我擺脫了循環使用: 'indices = find(JAbs); JAbs = JAbs(indices); JX = JX(indices);' 雖然我不確定這是不錯的風格,有什麼意見? – Achim

+0

@Achim:如果它返回所需的結果,我沒有看到任何問題。我有一段時間沒有使用MATLAB,所以我不能說更多..看看這個線程,在討論相同的主題,有一些方法提到:http:// www。 mathworks.nl/matlabcentral/newsreader/view_thread/159824 – posdef

10
>> X=[1 2 3; 3 2 0; 1 2 3;0 3 2] 
X = 
    1  2  3 
    3  2  0 
    1  2  3 
    0  3  2 

刪除行用零

X(sum((X==0),2)>0,:) = [] 

結果:[從基質去除零 - 不疏]的

X = 
    1  2  3 
    1  2  3 
+0

如果MATLAB允許負指數表示移除,那麼** R **的確如此: - 是不是很好 –