如何找到元素数组的索引数组?

时间:2011-10-27 20:40:46

标签: matlab

我想用一个例子来展示我想要的东西。

A = [5 1 2 4 3]; % of distinct values

B = [3 3 1 5 2];

我可以找到在MATLAB中实现的库函数:

C = [5 5 2 3 1] = someFun(A, B)

即。 C(i) = find(A == B(i))

请注意,我要求库函数,因为在这种情况下它是高度优化的。如果您确定不存在这样的功能,那也是一个答案。

3 个答案:

答案 0 :(得分:3)

我愿意:

IX(A) = [1:length(A)];
C=IX(B)

这比ismember解决方案快10倍:

A=randperm(1e5);
B=ceil(rand(1,1e4)*length(A));

tic; 
[D,C1]=ismember(B,A); 
toc % Elapsed time is 0.013728 seconds.


tic
IX(A) = [1:length(A)];
C=IX(B);
toc % Elapsed time is 0.001506 seconds.

但这可以在更严格的条件下使用:

  1. A仅包含唯一的整数。
  2. 0< B(i)<所有max(A)
  3. i
  4. 内存可以包含大小为max(A)
  5. 的数组

答案 1 :(得分:1)

一些解决方案:

for循环

C = zeros(size(B));
for i=1:numel(B)
    C(i) = find(A == B(i));
end

arrayfun

C = arrayfun(@(n)find(A==n), B)

使用BSXFUN

进行矢量化等式
[C,~] = find( bsxfun(@eq, B, A.') )

ismember

[~,C] = ismember(B,A)

答案 2 :(得分:0)

你能澄清一下你的问题吗?

如果你想要一个返回包含值B(i)的A的索引的函数,那么这样的函数应该可以工作:

for(int i = 0; i < B.length; i++)
{
    for(int q = 0; q < A.length; q++)
    {
        if(B[i] == A[q])
           C[i] = q;
    }
}