Используйте второй выход ismember
. ismember
указывает, находятся ли значения в первом наборе в любом месте во втором наборе. Второй вывод указывает, где находятся эти значения, если мы найдем что-нибудь. Таким образом:
A = {'a';'b';'c'}
B = {'b';'a';'c'}
[~,idx] = ismember(A, B);
Обратите внимание, что при объявлении массивов ячеек имеется небольшая опечатка. У вас есть толстая кишка между b
и c
для A
и a
и c
для B
. Я поместил туда двоеточие для обоих.
Таким образом, мы получаем:
idx =
2
1
3
Бенчмаркинг
У нас есть три очень хорошие алгоритмы здесь. Таким образом, давайте посмотрим, как это происходит, выполняя тест бенчмаркинга. Я собираюсь создать массив случайных символов размером 10000 х 1 строчных букв. Затем он будет инкапсулирован в массив ячеек 10000 x 1, где каждая ячейка представляет собой единый массив символов. Я построю A
таким образом, а B
представляет собой случайную перестановку элементов в A
. Это код, который я написал, чтобы сделать это для нас:
letters = char(97 + (0:25));
rng(123); %// Set seed for reproducibility
ind = randi(26, [10000, 1]);
lettersMat = letters(ind);
A = mat2cell(lettersMat, ones(10000,1), 1);
B = A(randperm(10000));
Теперь ... вот приходит код тестирования:
clear all;
close all;
letters = char(97 + (0:25));
rng(123); %// Set seed for reproducibility
ind = randi(26, [10000, 1]);
lettersMat = letters(ind);
A = mat2cell(lettersMat, 1, ones(10000,1));
B = A(randperm(10000));
tic;
[~,idx] = ismember(A,B);
t = toc;
fprintf('ismember: %f\n', t);
clear idx; %// Make sure test is unbiased
tic;
[~,idx] = max(bsxfun(@eq,char(A),char(B)'));
t = toc;
fprintf('bsxfun: %f\n', t);
clear idx; %// Make sure test is unbiased
tic;
[~, indA] = sort(A);
[~, indB] = sort(B);
idx = indB(indA);
t = toc;
fprintf('sort: %f\n', t);
Это то, что я получаю для синхронизации:
ismember: 0.058947
bsxfun: 0.110809
sort: 0.006054
Подход Луиса Мендо самый быстрый, затем ismember
, а затем, наконец, bsxfun
. Для компактности кода предпочтительнее ismember
, но для производительности лучше sort
. Лично я считаю, что bsxfun
должен побеждать, потому что это такая хорошая функция для использования;).
Смотри также [Сопоставление идентификаторов двух векторов] (http://stackoverflow.com/questions/21788606/mapping-ids-of-two-vectors/21790654#21790654) –