通过ismember查找所有指数

use*_*261 11 matlab

这是以下一个示例中描述的内容ismember:

定义两个具有共同值的向量.

A = [5 3 4 2]; B = [2 4 4 4 6 8];

确定哪些元素A也是B以及它们在相应的位置B.

[Lia,Locb] = ismember(A,B)

结果是:

Lia =
     0     0     1     1

Locb =    
     0     0     2     1
Run Code Online (Sandbox Code Playgroud)

B匹配最低索引的元素A(3)B(2).A(4)等于B(1).有没有办法找到匹配相同元素的元素的所有索引?BA

Eit*_*n T 5

您可以将输入参数交换为ismember:

[tf, ia] = ismember(B, A)
Run Code Online (Sandbox Code Playgroud)

举个例子,你应该得到:

tf =
     1     1     1     1     0     0

ia = 
     4     3     3     3     0     0
Run Code Online (Sandbox Code Playgroud)

这可以让你找到,说,所有元素的索引B是等于A(3)简单地做:

find(ia == 3)
Run Code Online (Sandbox Code Playgroud)

对于一般情况,这是一个很好的解决方案:

[tf, ia] = ismember(B, A);
idx = 1:numel(B);
ib = accumarray(nonzeros(ia), idx(tf), [], @(x){x});
Run Code Online (Sandbox Code Playgroud)

请注意,输出是一个单元格数组.举个例子,你应该得到:

ib = 
    []
    []
    [2     3     4]
    [      1]
Run Code Online (Sandbox Code Playgroud)

这意味着有在没有元素B匹配A(1)A(2),A(3)匹配元件B(2),B(3)B(4),和A(4)等于B(1).