split a matrix according to a column with matlab.

后端 未结 3 1149
别那么骄傲
别那么骄傲 2021-01-14 13:57
A = [1,4,2,5,10
     2,4,5,6,2
     2,1,5,6,10
     2,3,5,4,2]

And I want split it into two matrix by the last column A ->B and C

B         


        
3条回答
  •  广开言路
    2021-01-14 14:36

    Use accumarray in combination with histc:

    % Example data (from Mohsen Nosratinia)
    A = [...
         1     4     2     5    10
         2     4     5     6     2
         2     1     5     6    10
         2     3     5     4     2
         0     3     1     4     9
         1     3     4     5     1
         1     0     4     5     9
         1     2     4     3     1];
    
    % Get the proper indices to the specific rows
    B = sort(A(:,end)); 
    [~,b] = histc(A(:,end), B([diff(B)>0;true]));
    
    % Collect all specific rows in their specific groups
    C = accumarray(b, (1:size(A,1))', [], @(r) {A(r,:)} );
    

    Results:

    >> C{:}
    ans =
         1     3     4     5     1
         1     2     4     3     1
    ans =
         2     3     5     4     2
         2     4     5     6     2
    ans =
         0     3     1     4     9
         1     0     4     5     9
    ans =
         2     1     5     6    10
         1     4     2     5    10
    

    Note that

    B = sort(A(:,end)); 
    [~,b] = histc(A(:,end), B([diff(B)>0;true]));
    

    can also be written as

    [~,b] = histc(A(:,end), unique(A(:,end)));
    

    but unique is not built-in and is therefore likely to be slower, especially when this is all used in a loop.

    Note also that the order of the rows has changed w.r.t. the order they had in the original matrix. If the order matters, you'll have to throw in another sort:

    C = accumarray(b, (1:size(A,1))', [], @(r) {A(sort(r),:)} );
    

提交回复
热议问题