2017-04-16 30 views

回答

3

使用ismember'rows'说法:

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

这里是指一种方法性能 -

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)); 

解释这一点,我们可以在两个元素的每一行转换为标考虑到每一个每行作为索引元组,给我们1D版本的输入,A1DB1D。然后我们将这些数据追加到一个数组中:BA1D = [B1D ; A1D]并获取排序后的索引。由于排序,来自A1D的指数将具有较高的指数,表明这些是我们需要寻找的匹配。这是这里的基本想法。

另外,还要注意是否有AB负数,我们需要在min带来计算s在开始。

时序和验证

>> % --- 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.