Grouping continuous nonzero in a row vector

조회 수: 8 (최근 30일)
Mona Mahboob Kanafi
Mona Mahboob Kanafi 2013년 11월 1일
답변: Emma DeWitt Cotter 2017년 3월 15일
Dear All,
Is there any MATLAB function to ease grouping continuous nonzero elements of a row vector? I will explain further in the example below:
If I have such a simple row vector: A = [0,0,0,0,3,2,5,2,4,1,5,0,1,2,5,0,0,0,0,0,0,0,0,0,1,1,2,6,3,1]
Then I need to work on each continuous nonzero groups separately, i.e. I need to obtain matrices below to further analyze each group:
A1 = [3,2,5,2,4,1,5] ; A2 = [1,2,5] ; A3 = [3,2,5,2,4,1,5];
Thanks!

채택된 답변

Cedric
Cedric 2013년 11월 1일
편집: Cedric 2013년 11월 1일
Here is one solution..
wrap = [0, A, 0] ;
temp = diff( wrap ~= 0 ) ;
blockStart = find( temp == 1 ) + 1 ;
blockEnd = find( temp == -1 ) ;
blocks = arrayfun( @(bId) wrap(blockStart(bId):blockEnd(bId)), ...
1:numel(blockStart), 'UniformOutput', false ) ;
With that, you get
>> blocks{1}
ans =
3 2 5 2 4 1 5
>> blocks{2}
ans =
1 2 5
>> blocks{3}
ans =
1 1 2 6 3 1
Another solution would be to compute the start and size of clusters of 0's, eliminate the latter from A, and MAT2CELL what remains using proper boundaries based on the aforementioned start and size information.
  댓글 수: 2
Mona Mahboob Kanafi
Mona Mahboob Kanafi 2013년 11월 5일
Thank you very much man!
Cedric
Cedric 2013년 11월 5일
You're welcome.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Andrei Bobrov
Andrei Bobrov 2013년 11월 5일
편집: Andrei Bobrov 2013년 11월 6일
A = [0,0,0,0,3,2,5,2,4,1,5,0,1,2,5,0,0,0,0,0,0,0,0,0,1,1,2,6,3,1];
ii = zeros(size(A));
jj = A > 0;
ii(strfind([0,jj(:)'],[0 1])) = 1;
idx = cumsum(ii).*jj;
out = accumarray( idx(jj)',A(jj)',[],@(x){x'});
  댓글 수: 3
Andrei Bobrov
Andrei Bobrov 2013년 11월 6일
Hi Mona! I corrected.
Mona Mahboob Kanafi
Mona Mahboob Kanafi 2013년 11월 6일
Thankss a lot, quite clever!

댓글을 달려면 로그인하십시오.


Akhlaqur Rahman
Akhlaqur Rahman 2017년 1월 9일
y = [1 2 1 3 1 4 0 0 0 0 4 5 2 3 0 0 5 4 2 3 0 0 0 4 5 3];
y = padarray(y,[0,3]);
y1 = uint8(y>0);
k = 1;
j = 1;
for i = 1+1:length(y)-1
if y1(i)>0 && y(i-1)==0
x1(j) = i;
j = j+1;
elseif y1(i)==0 &&y1(i-1)>0
x2(k) = i;
k = k+1 ;
end
end
for i = 1:length(x1)-1
z{i}=y(x1(i):x2(i)-1);
cell2mat(z(i))
end

Emma DeWitt Cotter
Emma DeWitt Cotter 2017년 3월 15일
This can also be achieved using the bwconncomp function if you have the Image Processing toolbox. The PixelIdxList field will be a cell containing the list of indices associated with each group of nonzero elements.

카테고리

Help CenterFile Exchange에서 Sparse Matrices에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by