Select matrices with nonzero rows from a bigger matrix ?
3 次查看(过去 30 天)
显示 更早的评论
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 !
0 个评论
采纳的回答
Ameer Hamza
2020-4-26
编辑:Ameer Hamza
2020-4-26
This nice little function from the image processing toolbox (bwconncomp) will be very useful here.
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 ];
mask = sum(B, 2)~=0;
comps = bwconncomp(mask);
compMaskList = comps.PixelIdxList;
B_components = cell(numel(compMaskList), 1);
for i=1:numel(compMaskList)
B_components{i} = B(compMaskList{i}, :);
end
This shorter version is equivalent to the above code
comps = bwconncomp(sum(B, 2)~=0);
B_comps = cellfun(@(x) {B(x, :)}, comps.PixelIdxList);
5 个评论
Ameer Hamza
2020-4-26
If you run 'sum(B, 2)~=0', you get
>> sum(B, 2)~=0
ans =
16×1 logical array
0
0
0
0
1
1
1
1
0
0
0
1
1
1
0
0
So bwconncomp detects that there are two groups of 1s and gives back their row number.
更多回答(1 个)
dpb
2020-4-26
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 个评论
dpb
2020-4-27
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...
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!