Ответ 1
Дано:
A_1 = [10 200 7 150]';
A_2 = [0.001 0.450 0.007 0.200]';
(Как уже указывали другие) Существуют инструменты для простого вычисления корреляции, наиболее очевидно corr
:
corr(A_1, A_2); %Returns 0.956766573975184 (Requires stats toolbox)
Вы также можете использовать базовую функцию Matlab corrcoef
, например:
M = corrcoef([A_1 A_2]): %Returns [1 0.956766573975185; 0.956766573975185 1];
M(2,1); %Returns 0.956766573975184
который тесно связан с функцией cov
:
cov([condition(A_1) condition(A_2)]);
Как вы почти добираетесь в своем первоначальном вопросе, вы можете масштабировать и корректировать векторы самостоятельно, если хотите, что дает немного лучшее понимание того, что происходит. Сначала создайте функцию условия, которая вычитает среднее значение и делит на стандартное отклонение:
condition = @(x) (x-mean(x))./std(x); %Function to subtract mean AND normalize standard deviation
Тогда корреляция представляется (A_1 * A_2)/(A_1 ^ 2) следующим образом:
(condition(A_1)' * condition(A_2)) / sum(condition(A_1).^2); %Returns 0.956766573975185
По симметрии это также должно работать
(condition(A_1)' * condition(A_2)) / sum(condition(A_2).^2); %Returns 0.956766573975185
И это так.
Я считаю, но у меня нет энергии, чтобы подтвердить прямо сейчас, что та же математика может быть использована для вычисления корреляционных и кросс-корреляционных терминов при работе с многодискретными входами, если при обработке размеров и ориентации входных массивов.