2011-08-31 103 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 **的确如此: - 是不是很好 –