フィルターのクリア

Select matrices with nonzero rows from a bigger matrix ?

1 回表示 (過去 30 日間)
Geraldine Ejimadu
Geraldine Ejimadu 2020 年 4 月 26 日
コメント済み: dpb 2020 年 4 月 27 日
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 !

採用された回答

Ameer Hamza
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
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.
Geraldine Ejimadu
Geraldine Ejimadu 2020 年 4 月 27 日
It works, thank you so much!!!

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

その他の回答 (1 件)

dpb
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 件のコメント
Geraldine Ejimadu
Geraldine Ejimadu 2020 年 4 月 27 日
Thank you!! This is really helpful!
dpb
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 ExchangeLogical についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by