Remove rows of zeroes, and extract the removed rows indices

1 view (last 30 days)
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.

Accepted Answer

Star Strider
Star Strider on 4 Mar 2017
Edited: Star Strider on 4 Mar 2017
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 Comments
Image Analyst
Image Analyst on 4 Mar 2017
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 on 4 Mar 2017
@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.

Sign in to comment.

More Answers (1)

Image Analyst
Image Analyst on 4 Mar 2017
Try this:
rowsToKeep = ~all(T == 0, 2)
t2 = T(rowsToKeep, :)

Community Treasure Hunt

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

Start Hunting!