Hoe de index-array van een reeks elementen te vinden?

Ik wil graag een voorbeeld gebruiken om te laten zien wat ik wil.

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

B = [3 3 1 5 2];

Kan ik een bibliotheekfunctie vinden die is geïmplementeerd in MATLAB, zodat:

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

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

Merk op dat ik om een ​​bibliotheekfunctie vraag, omdat het in dat geval zeer geoptimaliseerd is. Als je zeker weet dat zo'n functie niet bestaat, is dat ook een antwoord.

2

3 antwoord

Ik zou doen:

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

Dit is tien keer sneller dan de ismember -oplossing:

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.

Maar dit kan worden gebruikt onder strengere voorwaarden:

  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
toegevoegd
Een heel leuk antwoord. +1 voor jou.
toegevoegd de auteur dalibocai, de bron

Een paar oplossingen:

for loop

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

arrayfun

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

gevectoriseerde gelijkheid met behulp van BSXFUN

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

ismember

[~,C] = ismember(B,A)
1
toegevoegd
Persoonlijk zou ik gaan met ISMEMBER
toegevoegd de auteur Amro, de bron
goed, we willen de complexe conjugaten niet .. Ik zou ook voorzichtig zijn als het getal drijvende-komma's is en niet alleen gehele getallen, en controleer in plaats daarvan of het absolute verschil kleiner is dan een willekeurige epsilon-drempel
toegevoegd de auteur Amro, de bron
+1 maar kijk uit dat '. Het werkt niet als A complex is. Het moet . ' zijn
toegevoegd de auteur Luis Mendo, de bron

Kunt u uw vraag een beetje verduidelijken?

Als u een functie wilt die de index van A retourneert die de waarde B (i) bevat, zou een functie als deze moeten werken:

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
toegevoegd
Bedankt. Plz zie mijn herziene vraag.
toegevoegd de auteur dalibocai, de bron