这里是指一种方法性能 -
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
版本的输入,A1D
和B1D
。然后我们将这些数据追加到一个数组中:BA1D = [B1D ; A1D]
并获取排序后的索引。由于排序,来自A1D
的指数将具有较高的指数,表明这些是我们需要寻找的匹配。这是这里的基本想法。
另外,还要注意是否有A
或B
负数,我们需要在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.