使用ismember列出所有索引

时间:2015-04-14 06:56:45

标签: matlab indexing

所以说我有两个阵列:

    A:14 63 13
      38 44 23
      11 12 13
      38 44 23

    B:38 44 23 

我正在尝试使用ismember返回B中找到A的每个位置的索引。我在网上找到的所有例子都列出了匹配的第一个或最后一个匹配项,我试图为所有匹配的值设置一个列表索引,甚至重复一个。谢谢

4 个答案:

答案 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