2017-04-16 1 views

Antwort

3

Verwendung ismember mit 'rows' Argumente haben:

A = [2  3; 
    7  1 ; 
    5  4 ; 
    8  6 ]; 
B = [ 1  4; 
    2  3 ; 
    4  2; 
    7  1; 
    7  9; 
    0  1; 
    5  4 ; 
    14 15 ; 
    13 10 ; 
    6  8; 
    8  6 ]; 
b = find(ismember(B,A,'rows')) 
2

Hier ist ein Ansatz gemeint für die Leistung -

function out_idx = intersect_index(A,B) 

s = max(max(A(:,1),[],1),max(B(:,1),[],1)) + 1; 

A1D = A(:,2)*s + A(:,1); 
B1D = B(:,2)*s + B(:,1); 

BA1D = [B1D ; A1D]; 
[~,idx] = sort(BA1D); 
out_idx = sort(idx(find(idx>numel(B1D))-1)); 

es ein wenig zu erklären, könnten wir jede Zeile von zwei Elementen als Skalar konvertieren jeder jede Zeile als Indizierung Tupel Betrachtung uns 1D Versionen der Eingänge als A1D und B1D geben. Wir fügen diese dann in ein Array mit: BA1D = [B1D ; A1D] und holen die sortierten Indizes. Aufgrund der Sortierung hätten Indizes von A1D höhere Indizes, was anzeigt, dass es sich um die Übereinstimmungen handelt, nach denen wir suchen müssen. Das ist die Grundidee hier.

Beachten Sie auch, dass, wenn es negative Zahlen in A oder B wir in min mitbringen müssen s am Anfang zu berechnen.

Timings und Verifikations

>> % --- Setup inputs 
B = randi(100000,150000,2); 
B = unique(B,'rows'); 
A = B(randperm(size(B,1),3072),:); 
>> out1 = intersect_index(A,B);  % Proposed in this post 
>> out2 = find(ismember(B,A,'rows')); % @user2999345's soln 
>> all(out1 == out2) 
ans = 
    1 
>> tic,find(ismember(B,A,'rows')); toc % @user2999345's soln 
Elapsed time is 0.066226 seconds. 
>> tic, intersect_index(A,B); toc  % Proposed in this post 
Elapsed time is 0.010360 seconds. 
Verwandte Themen