どのように要素の配列のインデックス配列を見つけるには?

私は、私が望むものを示すために例を挙げたいと思います。

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)

i.e. C(i) = find(A == B(i))

その場合、高度に最適化されているように、私はライブラリ関数を求めています。そのような関数が存在しないことが確かであれば、それも答えです。

2

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 contains only unique integers.
  2. 0 < B(i) < max(A) for all i
  3. The memory can hold an array of size max(A)
3
追加された
とても素敵な答えです。 +1してください。
追加された 著者 dalibocai,

いくつかのソリューション:

for-loop

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

アレイフン

C = アレイフン(@(n)find(A==n), B)

BSXFUNを使用したベクトル化された等価

[C,~] = find( bsxfun(@eq, B, A.') )

ismember

[~,C] = ismember(B,A)
1
追加された
個人的には ISMEMBER
追加された 著者 Amro,
私たちは複素共役を必要としません。もし整数が単なる整数ではなく浮動小数点であり、絶対差がいくつかのε値
追加された 著者 Amro,
+1してくださいが、 'に注意してください。 A が複雑な場合は動作しません。 にする必要があります。
追加された 著者 Luis Mendo,

あなたの質問を少しはっきりさせることができますか?

値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;
    }
}
0
追加された
ありがとう。私の改訂された質問を参照してください。
追加された 著者 dalibocai,