Bir dizi öğenin dizin dizisi nasıl bulunur?

Ne istediğimi göstermek için bir örnek kullanmak istiyorum.

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

B = [3 3 1 5 2];

MATLAB'da uygulanan bir kütüphane işlevi bulabilir miyim?

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

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

Bir kütüphane işlevi istediğimi unutmayın, bu durumda yüksek oranda optimize edilmiştir. Böyle bir işlev olmadığından eminseniz, bu da bir cevaptır.

2

3 cevap

Yapardım:

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

Bu ismember çözümünden 10 kat daha hızlıdır:

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.

Ancak bu daha sıkı koşullar altında kullanılabilir:

  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
katma
Çok hoş bir cevap. Senin için +1.
katma yazar dalibocai, kaynak

Bir çift çözüm:

döngü için

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 kullanılarak vektörize eşitlik

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

IsMember

[~,C] = IsMember(B,A)
1
katma
kişisel olarak ISMEMBER ile giderdim
katma yazar Amro, kaynak
doğru, karmaşık konjugatları istemiyoruz. Ayrıca, sayı tamsayılar değil, kayan noktalar ise dikkatli olmalıyım ve bunun yerine mutlak farkın bazı epsilon eşik değerlerinden daha az olduğunu kontrol etmeliyim
katma yazar Amro, kaynak
+1 ancak '' a dikkat edin. A karmaşıksa işe yaramaz. . olmalıdır.
katma yazar Luis Mendo, kaynak

Sorunu biraz açıklayabilir misin?

B (i) değerini içeren A dizinini döndüren bir işlev istiyorsanız, bunun gibi bir işlev çalışmalıdır:

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
katma
Teşekkürler. Plz gözden geçirilmiş sorumu görüyor.
katma yazar dalibocai, kaynak