【问题标题】:find array elements that match one of multiple conditions, sorted by condition matched查找匹配多个条件之一的数组元素,按条件匹配排序
【发布时间】:2015-06-05 00:15:04
【问题描述】:

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

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

【问题讨论】:

    标签: arrays matlab matrix cell-array


    【解决方案1】:

    您可以使用强大的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} 包含匹配uniqueCol1m-th 元素和uniqueCol2n-th 元素的子矩阵。

    例子:

    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
    

    【讨论】:

    • 太棒了,我的测试用例速度提高了 10 倍以上
    • 我说accumarray 很强大 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多