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

时间:2015-06-04 15:55:35

标签: arrays matlab matrix cell-array

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

我想找到所有子矩阵,它们将是p-by-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

1 个答案:

答案 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