所以说我有两个阵列:
A:14 63 13
38 44 23
11 12 13
38 44 23
B:38 44 23
我正在尝试使用ismember
返回B
中找到A
的每个位置的索引。我在网上找到的所有例子都列出了匹配的第一个或最后一个匹配项,我试图为所有匹配的值设置一个列表索引,甚至重复一个。谢谢
答案 0 :(得分:6)
将ismember
与'rows'
arugment:
ismember(A, B, 'rows')
导致逻辑数组[0 1 0 1]
通常比索引数组好,但如果你想要特定的索引那么只需使用find
:
find(ismember(A,B,'rows'))
返回[2,4]
请注意,如果B
包含多行,则此方法仍可用B = [38 44 23; 11 12 13]
,它会返回[0; 1; 1; 1]
答案 1 :(得分:5)
您可以使用bsxfun
进行比较:
idx = find( all( bsxfun(@eq, A, B), 2 )); %// only where all line matches
结果
idx =
2
4
答案 2 :(得分:3)
如果您将A和B作为Nx3
大小的数组,则可以查看pdist2
-
[indA,indB] = ind2sub([size(A,1) size(B,1)],find(pdist2(A,B)==0));
ind = [indA,indB]
因此,在ind
中,您将获得匹配的成对索引,其中第一列表示A
的索引,第二列表示B
的索引。
示例运行 -
A =
14 63 13
38 44 23
11 12 13
14 63 13
38 44 23
B =
38 44 23
14 63 13
ind =
2 1
5 1
1 2
4 2
答案 3 :(得分:2)
这只是shai's answer的改进版本,用于处理多行B
idx = find(any(all( bsxfun(@eq, A, permute(B,[3 2 1])), 2 ),3));
示例运行
A = [14 63 13;
38 44 23;
11 12 13;
38 44 23];
B = [38 44 23;
11 12 13];
idx = find(any(all( bsxfun(@eq, A, permute(B,[3 2 1])), 2 ),3));
>> idx
idx =
2
3
4