Как найти индексный массив из массива элементов? - PullRequest
2 голосов
/ 28 октября 2011

Я хотел бы использовать пример, чтобы показать, чего я хочу.

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 ]

3 голосов
/ 28 октября 2011

Я бы сделал:

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

Это в 10 раз быстрее, чем решение ismember:

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 <<code>B(i) <<code>max(A) для всех i
  3. Память может содержать массив размером max(A)
1 голос
/ 28 октября 2011

Пара решений:

для цикла

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)
0 голосов
/ 28 октября 2011

Не могли бы вы немного прояснить свой вопрос?

Если вам нужна функция, которая возвращает индекс A, который содержит значение B (i), то такая функция должна работать:

for(int i = 0; i < B.length; i++)
{
    for(int q = 0; q < A.length; q++)
    {
        if(B[i] == A[q])
           C[i] = q;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...