Grouping continuous nonzero in a row vector
    8 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Mona Mahboob Kanafi
      
 am 1 Nov. 2013
  
    
    
    
    
    Beantwortet: Emma DeWitt Cotter
 am 15 Mär. 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 Kommentare
Akzeptierte Antwort
  Cedric
      
      
 am 1 Nov. 2013
        
      Bearbeitet: Cedric
      
      
 am 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 Kommentare
Weitere Antworten (3)
  Andrei Bobrov
      
      
 am 5 Nov. 2013
        
      Bearbeitet: Andrei Bobrov
      
      
 am 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 Kommentare
  Akhlaqur Rahman
 am 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 Kommentare
  Emma DeWitt Cotter
 am 15 Mär. 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 Kommentare
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




