2015-06-04 110 views
1

我有一个m×n的矩阵(n> 3),其中两个第一列有很多重复的值。我有另外两个向量,称它们为uniqueCol1uniqueCol2,它们包含两列的所有可能值。查找匹配多个条件之一的数组元素,按匹配条件排序

我想找到所有的子矩阵,它将是p-by-n(p = < m),其中两个第一列匹配uniqueCol1uniqueCol2中的给定值。有多达length(uniqueCol1) * length(uniqueCol2)这样的子矩阵。

我可以使用ismember()来帮助找到这些子矩阵,但我不能看到这样做的方式,我会知道输出的哪些部分匹配什么条件。

或者我可以做一个循环,如下所示,但这是非常缓慢的。有没有一种矢量化以下的方法?我想这个解决方案的输出是这些子矩阵的一个单元阵列,因为每个子矩阵的大小通常不一样(所以多维数组将不起作用)。

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 

回答

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}包含的uniqueCol1m个元素和uniqueCol2n个元素相匹配的子矩阵。

例子:

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 
+0

精湛,是加快我的测试情况下增长超过10倍 – funklute

+0

我说'accumarray'是强大;-) –