我有一个矩阵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]
答案 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