Grouping continuous nonzero in a row vector
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Mona Mahboob Kanafi
le 1 Nov 2013
Réponse apportée : Emma DeWitt Cotter
le 15 Mar 2017
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!
0 commentaires
Réponse acceptée
Cedric
le 1 Nov 2013
Modifié(e) : Cedric
le 1 Nov 2013
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 commentaires
Plus de réponses (3)
Andrei Bobrov
le 5 Nov 2013
Modifié(e) : Andrei Bobrov
le 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'});
3 commentaires
Akhlaqur Rahman
le 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
0 commentaires
Emma DeWitt Cotter
le 15 Mar 2017
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.
0 commentaires
Voir également
Catégories
En savoir plus sur Sparse Matrices dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!