2015-06-04 155 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'是強大;-) –