查找匹配多个条件之一的数组元素,按条件匹配排序

find array elements that match one of multiple conditions, sorted by condition matched

我有一个 m×n 矩阵 (n > 3),其中前两列有很多重复值。我还有另外两个向量,称它们为 uniqueCol1uniqueCol2,它们包含两列的所有可能值。

我想找到所有子矩阵,它们将是 p×n (p =< m),其中前两列与 uniqueCol1uniqueCol2 中的给定值匹配.最多有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

您可以使用强大的 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}包含匹配uniqueCol1的第m个元素和uniqueCol2的第n个元素的子矩阵。

示例:

myBigMatrix =
     3     5     3
     3     2     2
     3     5     1
     3     2     1
     1     5     4
     4     3     4

给予

>> uniqueCol1.'
ans =
     1     3     4
>> uniqueCol2.'
ans =
     2     3     5

>> R
R = 
              []              []    [1x3 double]
    [2x3 double]              []    [2x3 double]
              []    [1x3 double]              []

>> R{2,1} %// submatrix corresponding to 3 in first col and 2 in second col
ans =
     3     2     2
     3     2     1

>> R{3,2} %// submatrix corresponding to 4 in first col and 3 in second col
ans =
     4     3     4