2015-10-11 56 views
0

我想查找大矩陣中的非相交行。作爲一個例子:查找矩陣中的非相交行

A=[1 5 3; 3 4 5; 7 9 10;4 5 6;11 2 8; 3 5 10] 

在這個矩陣中,非相交的行是:[1 5 3], [11 2 8][7 9 10]。我怎樣才能以快速的方式在Matlab中編程?

+4

什麼是非交叉點g行? –

+0

@AndrasDeak從我得到的結果來看,在最終輸出中不會考慮一行,如果之前有任何元素被用於任何行。 – Divakar

+0

@Andras Deak:正如Divakar所討論的那樣。謝謝Divakar。 – asd2014

回答

2

如果可以的話bsxfun -

M = squeeze(any(bsxfun(@eq,A,permute(unique(A),[3 2 1])),2)) 
[~,row_idx] = max(M,[],1) 
out = A(sum(M,2).' == histc(row_idx,1:size(A,1)),:) 

樣一步一步的運行 -

A = 
    1  5  3 
    3  4  5 
    7  9 10 
    4  5  6 
    11  2  8 
    3  5 10 
M = 
    1  0  1  0  1  0  0  0  0  0  0 
    0  0  1  1  1  0  0  0  0  0  0 
    0  0  0  0  0  0  1  0  1  1  0 
    0  0  0  1  1  1  0  0  0  0  0 
    0  1  0  0  0  0  0  1  0  0  1 
    0  0  1  0  1  0  0  0  0  1  0 
row_idx = 
    1  5  1  2  1  4  3  5  3  3  5 
out = 
    1  5  3 
    7  9 10 
    11  2  8 
+1

我在看'bsxfun',但被我嘗試使用的'intersect'函數毆打。做好工作 – Adriaan

+1

「如果我可以'bsxfun'」:誰可以,如果不是你?) –

+0

好工作!謝謝 – asd2014

0

你可以看看,將它們添加到以前行的聯合行增加元素的數量按列數結合(即該行中的所有元素都是新的):

B = []; 
C = zeros(1,size(A,1)); 
for k=1:size(A,1), 
    B1 = union(B, A(k,:)); 
    C(k) = numel(B1)-numel(B); 
    B=B1; 
end 
result = A(C==size(A,2),:); 
+0

好工作!謝謝 – asd2014