使用相等的第二列将矩阵分解为子矩阵而不使用for循环

时间:2014-11-06 11:12:47

标签: matlab

我有一个矩阵L,有两列。我想找到它的子矩阵在第二列上具有相同的值。我想在没有任何for循环的情况下使用MATLAB做到这一点。 例如:

L=[1 2;3 2;4 6;5 3;7 3;1 3;2 7;9 7] 

那么子矩阵是:

[1 2;3 2] , [4 6] , [5 3;7 3;1 3] and [2 7;9 7]

2 个答案:

答案 0 :(得分:2)

您可以使用arrayfun + unique的组合来获取 -

[~,~,labels] = unique(L(:,2),'stable')
idx = arrayfun(@(x) L(labels==x,:),1:max(labels),'Uniform',0)

显示输出 -

>> celldisp(idx)
idx{1} =
     1     2
     3     2
idx{2} =
     4     6
idx{3} =
     5     3
     7     3
     1     3
idx{4} =
     2     7
     9     7

答案 1 :(得分:0)

您可以直接使用accumarray或使用排序数组,具体取决于您希望行的顺序是稳定的,还是要使子索引的顺序保持稳定。

假设您希望行保持稳定:

>> [L2s,inds] = sort(L(:,2));
>> M = accumarray(L2s,inds,[],@(v){L(v,:)});
>> M(cellfun(@isempty,M)) = [];  % remove empty cells
>> celldisp(M)
M{1} =
     1     2
     3     2
M{2} =
     5     3
     7     3
     1     3
M{3} =
     4     6
M{4} =
     2     7
     9     7