Delete rows in a matrix that contain ONLY a negative number

3 ビュー (過去 30 日間)
Christina
Christina 2013 年 1 月 14 日
Hello
I've got a really large matrix (say 2000 x 3000) and I want to delete the rows that contain ONLY the negative number -999.
For example, I've got A = [5 3 -999 ; -999 -999 -999; 4 1 7 ; -999 -999 -999]
and I want my new matrix to be A = [5 3 -999 ; 4 1 7]
How can I do that?
Thanks!

採用された回答

Walter Roberson
Walter Roberson 2013 年 1 月 14 日
idx = all(A == -999, 2);
A(idx, :) = [];

その他の回答 (3 件)

Kye Taylor
Kye Taylor 2013 年 1 月 14 日
編集済み: Kye Taylor 2013 年 1 月 14 日
Try
isNegRow = all( A==-999, 2 );
A(isNegRow,:) = [];

Shashank Prasanna
Shashank Prasanna 2013 年 1 月 14 日
編集済み: Shashank Prasanna 2013 年 1 月 14 日
If you don't want to use loops and keep it simple in a single line, I suggest logical indexing as follows:
A(all(A==-999,2),:)=[]
This should do the trick.

Amith Kamath
Amith Kamath 2013 年 1 月 14 日
編集済み: Amith Kamath 2013 年 1 月 14 日
I'm quite positive that this does the trick. There would probably be more optimal ways to do it!
X = 100.*rand(12,5); %for example.
X([2 5],:) = -999; % artificially create rows to remove.
i = 1;
while i <= size(X,1)
if(sum(X(i,:) == -999) == size(X,2))
X(i,:) = [];
else
i = i+1;
end
end
  3 件のコメント
Amith Kamath
Amith Kamath 2013 年 1 月 14 日
Edited: Thanks Walter! Didn't catch that case earlier! Your answer is much more elegant anyways.
James Tursa
James Tursa 2013 年 1 月 15 日
編集済み: James Tursa 2013 年 1 月 15 日
Using a loop in this manner is very bad for performance. At each row that is deleted, potentially huge amounts of data will need to be copied. The same data can end up being copied many, many times. For a large matrix with many rows being deleted, this can easily result in a performance hit that is one or more orders of magnitude slower than the other answers shown above. (This is basically the same problem as increasing the size of an array in a loop). Best to get the indices of everything to be deleted first and then delete it all at once as shown above.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by