我有一个m-by-n矩阵(n> 3),其中两个第一列有很多重复值。我有另外两个向量,称为uniqueCol1
和uniqueCol2
,它们包含两列的所有可能值。
我想找到所有子矩阵,它们将是p-by-n(p =< m),其中两个第一列匹配uniqueCol1
和uniqueCol2
中的给定值。最多有length(uniqueCol1) * length(uniqueCol2)
个这样的子矩阵。
我可以使用ismember()
帮助找到这些子矩阵,但是我无法看到这样做的方法,我知道输出的哪些部分符合条件。
或者我可以进行for循环,如下所示,但这非常慢。有没有办法在下面进行矢量化?我想解决方案将输出这些子矩阵的单元阵列,因为每个子矩阵通常不是相同的大小(因此多维数组不起作用)。
myBigMatrix = round(wgn(1000,6,1) * 3);
uniqueCol1 = unique(myBigMatrix(:,1));
uniqueCol2 = unique(myBigMatrix(:,2));
for i = 1:length(uniqueCol1)
for j = 1:length(uniqueCol2)
mySubMatrix = myBigMatrix( ...
myBigMatrix(:,1) == uniqueCol1(i) & ...
myBigMatrix(:,2) == uniqueCol2(j) , :);
% then do something with mySubMatrix,
% as it's clear from i and j what condition it matched
end
end
答案 0 :(得分:2)
您可以使用强大的accumarray
功能执行此任务:
[uniqueCol1, ~, u1] = unique(myBigMatrix(:,1));
[uniqueCol2, ~, u2] = unique(myBigMatrix(:,2));
R = accumarray([u1 u2], (1:size(myBigMatrix,1)).', [], @(x) {myBigMatrix(sort(x),:)})
然后R{m,n}
包含与m
的{{1}}元素和uniqueCol1
的{{1}}元素相匹配的子矩阵。
示例:
n
给出
uniqueCol2