Select matrices with nonzero rows from a bigger matrix ?
Show older comments
Hello guys!
I am struggling with this problem:
I have a big matrix that is made of few zeros raws and many nonzero raws.
This is a fake simple example to explain, because in reality I am working with big data :(:
B= [0 0 0 0;
0 0 0 0;
0 0 0 0;
0 0 0 0 ;
1 1 2 3;
0 0 0 3;
1 1 1 0;
4 4 4 4;
0 0 0 0 ;
0 0 0 0;
0 0 0 0 ;
0 0 0 8;
0 0 1 0;
0 1 1 0;
0 0 0 0;
0 0 0 0 ];
The zero rows in this matrix, indicate that the signal stopped and I just need to analyse the non zero raws in chunks.
Therefore would like to obtain:
chunk_1=[1 1 2 3;0 0 0 3;1 1 1 0;4 4 4 4]
chunk_2=[0 0 0 8;0 0 1 0;0 1 1 0;]
As you can see the chunks don't have to have the same amount of raws, since I analyse them individually, and the zero chunks also don't have the same number of rows.
I hope you guys have more knowledge than ve and could help me!
Thanks in advance !
Accepted Answer
More Answers (1)
dpb
on 26 Apr 2020
Any number of these kinds of Q? on Answers -- under "runs" or any number of other terms...but, it's pretty simple to code from scratch--
d=diff([false;any(B,2)]); % locations with any observations--T
ix=[find(d==1) find(d==-1)]; % find start, end of sections 0->1, 1->0
C=arrayfun(@(i) B(ix(i,1):ix(i,2),:),1:size(ix,1),'UniformOutput',false); % cell array of contents by group
4 Comments
Geraldine Ejimadu
on 26 Apr 2020
dpb
on 27 Apr 2020
Try it with your simple example data...start from inside out--first what is "d"?---
>> [B d]
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 2 3 1
0 0 0 3 0
1 1 1 0 0
4 4 4 4 0
0 0 0 0 -1
0 0 0 0 0
0 0 0 0 0
0 0 0 8 1
0 0 1 0 0
0 1 1 0 0
0 0 0 0 -1
0 0 0 0 0
>>
any(x,2) gave us a true everywhere there was any nonzero row; diff() on that is only +/-1 when the value changes -- an initial start, then stop, ...
Next, simply extract those start:stop locations to an array of two vectors.
arrayfun is just a for...end loop on one line -- it uses the anonymous function @(i) B(ix(i,1):ix(i,2),:) as its action -- that's just a colon operation of B(i1:i2) for rows and : for all columns.
The next term is the indices over which to loop: 1:size(ix,1) which is just the number of row in our indexing array we built. Could write the function to use two input arguments and pass ix(:,1), ix(:,2); I just used the one index to the array and put the ix array inside.
Lastly, since returns a variable number of outputs, arrayfun needs to know to return results as a cell array or 'uniformoutput', false Otherwise, it'll fail as the output would have to be able to be concatenated into a single ouptut. But, you don't really want that here,anyway; you get the cell array of the data you're looking for for each case in a cell containing the array of doubles.
Geraldine Ejimadu
on 27 Apr 2020
dpb
on 27 Apr 2020
Very common type problem and typical use of diff for pattern-matching. "Trick" worth knowing; can adapt to many situations with thought.
May not always have Image Processing TB (as I don't) so need to be able to do oneself...
Categories
Find more on Image Arithmetic in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!