Как вы говорите, чтобы вычислить значения для E
, вам нужно вычислить индексы в B
, которые соответствуют каждому элементу в A
, неофициально где A == B
. Это, очевидно, не сработает, потому что A
и B
имеют разные размеры. Но мы можем получить то, что хотим, думая о вещах как о 2D-сетке. Переставьте один из векторов и сравните их.
A == B.'
% or for older versions of MATLAB (won't implicitly expand the different sized variables)
bsxfun(@eq, A, B.')
ans =
7×11 logical array
0 0 0 0 0 0 0 0 0 0 1
0 0 1 1 0 1 0 0 0 0 0
0 0 0 0 1 0 1 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 0 0
% to help visualise
% A = [5 5 1 1 3 1 3 11 9 6 -2];
% B = [-2 1 3 5 6 9 11];
Вы можете видеть, что для каждого столбца позиция 1 говорит нам, где мы можем найти этот элемент в A
в векторе B
, Мы можем использовать find
, чтобы получить индексы строк каждого 1, и использовать это для вычисления E.
[indices, ~] = find(A == B.');
E = C(indices);
Конечный результат
Если вы хотите вычислить это с одной строкой кода , вы можете использовать сделать следующее
A=[5 5 1 1 3 1 3 11 9 6 -2];
[B, ia, ic]=unique(A);
C = accumarray(ic,1);
E = C(mod(find(B.' == A)-1, length(B))+1).';
% or for older versions of MATLAB
E = C(mod(find(bsxfun(@eq, A, B.'))-1, length(B))+1).';