我有一个大小为3072 x 2的数组,我想在150000 x 2数组中找到行索引。例如,如果我们有
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 =
2
4
7
11
答案 0 :(得分: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'))
答案 1 :(得分: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
个版本的输入作为A1D
和{{1 }}。然后我们将这些数据附加到一个数组中:B1D
并获取已排序的索引。由于排序,BA1D = [B1D ; A1D]
的索引会有更高的索引,表明这些是我们需要查找的匹配项。这是这里的基本想法。
另请注意,如果A1D
或A
中有负数,我们需要在开始时将B
引入计算min
。
计时和验证
s