Remove rows of zeroes, and extract the removed rows indices

1 回表示 (過去 30 日間)
czeslaw
czeslaw 2017 年 3 月 4 日
コメント済み: Star Strider 2017 年 3 月 4 日
Hi all,
I have T =
0 0 0 0
1 2 0 4
5 6 0 8
0 0 0 0
10 11 0 12
t2=T(any(T,2),:) will give
t2 =
1 2 0 4
5 6 0 8
10 11 0 12
But how can I efficiently retrieve the indices of the removed rows from T, that is: 1,4 ?? Then how can I efficiently retrieve the indices of the not removed rows from T, that is: 2,3,5 ?? Without using while, for loop etc.
Thank you in advance.

採用された回答

Star Strider
Star Strider 2017 年 3 月 4 日
編集済み: Star Strider 2017 年 3 月 4 日
This works:
T = [0 0 0 0
1 2 0 4
5 6 0 8
0 0 0 0
10 11 0 12];
RemovedRows = all(T == 0, 2)
RemovedRowsIdx = find(RemovedRows)
KeptRowsIdx = find(any(T,2))
RemovedRows =
5×1 logical array
1
0
0
1
0
RemovedRowsIdx =
1
4
KeptRowsIdx =
2
3
5
EDIT Remembered ‘KeptRowsIdx’.
  4 件のコメント
Image Analyst
Image Analyst 2017 年 3 月 4 日
If speed is what was needed, you shouldn't even use find() at all. I doubt he really needed the actual row numbers - that's why I didn't even bother to compute them. I think it's just the final matrix that is wanted. He'll probably never even use the row numbers again - so use logical indexing, which you already have, rather than doing the additional step to get linear indexing.
Star Strider
Star Strider 2017 年 3 月 4 日
@Image Analyst —
Possibly, but that wasn’t the impression I got.
Quoting:
  • ‘But how can I efficiently retrieve the indices of the removed rows from T, that is: 1,4 ??Then how can I efficiently retrieve the indices of the not removed rows from T, that is: 2,3,5 ??’
The index numbers appear to be requested.

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

その他の回答 (1 件)

Image Analyst
Image Analyst 2017 年 3 月 4 日
Try this:
rowsToKeep = ~all(T == 0, 2)
t2 = T(rowsToKeep, :)

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by