Получение отображения для перестановки в MATLAB - PullRequest
7 голосов
/ 28 марта 2012

Скажем, у меня есть два массива, где один является перестановкой другого:

A = [2 1 5 3 7]
B = [7 2 1 3 5]

без повторов в любом массиве.

Как я могу получить отображение перестановки между ними?

например. A->B должно быть:

[2, 3, 5, 4, 1]

, что означает:

A(1) -> B(2)
A(2) -> B(3)
A(3) -> B(5)
A(4) -> B(4)
A(5) -> B(1)

Обновление:

Существует ли fast векторизованное решение, которое не использует ismember? По моему опыту, ismember имеет тенденцию быть медленным для очень больших массивов.

Ответы [ 4 ]

17 голосов
/ 28 марта 2012

Как насчет этого:

[i a] = sort(A);
[i b] = sort(B);
mapping = b(a)
6 голосов
/ 28 марта 2012

Использование ismember.

[~,idx] = ismember(A,B);

Вектор idx будет содержать такие индексы, что B(idx) == A.

Обратите внимание, что ismember находит самые высокие индексы.

1 голос
/ 17 июня 2013

Вы также можете использовать knnsearch, но для неповторяющихся членов в a и b

0 голосов
/ 28 марта 2012

Попробуйте это:

for i=1:size(B)
C(:,i) = [i find(B==A(i))]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...