2015-10-11 3 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: это точно так же, как обсуждался Дивакар. Спасибо Дивакар. – 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

Смежные вопросы