Asked by Mona Mahboob Kanafi
on 1 Nov 2013

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!

Answer by Cedric Wannaz
on 1 Nov 2013

Edited by Cedric Wannaz
on 1 Nov 2013

Accepted Answer

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.

Mona Mahboob Kanafi
on 5 Nov 2013

Thank you very much man!

Cedric Wannaz
on 5 Nov 2013

You're welcome.

Sign in to comment.

Answer by Andrei Bobrov
on 5 Nov 2013

Edited by Andrei Bobrov
on 6 Nov 2013

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'});

Mona Mahboob Kanafi
on 6 Nov 2013

Hi Andrei, Thanks for your answer. Nice idea, only for the use of accumarray it gives an error

Andrei Bobrov
on 6 Nov 2013

Hi Mona! I corrected.

Mona Mahboob Kanafi
on 6 Nov 2013

Thankss a lot, quite clever!

Sign in to comment.

Answer by Akhlaqur Rahman
on 9 Jan 2017

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

Sign in to comment.

Answer by Emma DeWitt Cotter
on 15 Mar 2017

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.