Как написать коэффициент корреляции вручную в Matlab?

Ниже приведена функция, которая принимает два вектора одинакового размера X и Y и должна возвращать вектор, содержащий одиночные коэффициенты корреляции для соответствия изображения. Предполагается, что функция работает аналогично встроенной функции corr(X,Y) в Matlab, если заданы два вектора одинакового размера. Прямо сейчас мой код создает вектор, содержащий несколько векторов с двумя числами, вместо вектора, содержащего одиночные числа. Как я могу это исправить?

function result = myCorr(X, Y)

meanX = mean(X);
meanY = mean(Y);
stdX = std(X);
stdY = std(Y);

for i = 1:1:length(X),
    X(i) = (X(i) - meanX)/stdX;
    Y(i) = (Y(i) - meanY)/stdY;
    mult = X(i) * Y(i);
end

result = sum(mult)/(length(X)-1);
end

Изменить: чтобы уточнить, я хочу, чтобы myCorr(X,Y) выше выдавал тот же результат в corr(X,Y) Matlab при задании векторов одинакового размера значений интенсивности изображения.

Редактировать 2: теперь формат выходного вектора правильный, однако значения сильно отличаются.


person Teej    schedule 19.04.2017    source источник
comment
Возможна синтаксическая ошибка. zx и zy будут единственными значениями в вашем цикле. Я предполагаю, что вы бы хотели, чтобы они были векторами? zx(i) и zy(i)? Вы можете избежать зацикливания, просто вычислив то, что вы хотите векторизовать: zx = (X - meanX) / stdX; zy = (Y - meanY) / stdY;. Кроме того, в зависимости от вашей версии MATLAB вам может потребоваться явно выполнить поэлементное умножение: mult = zx .* zy;.   -  person rayryeng    schedule 19.04.2017
comment
Я немного обновил свою функцию, но я все еще не думаю, что она возвращает правильный коэффициент.   -  person Teej    schedule 19.04.2017
comment
Ваш mult также неверен. Он сообщает только об одном значении, которое находится в конце цикла.   -  person rayryeng    schedule 19.04.2017
comment
как мне изменить mult, чтобы он хранил массив всех значений перемноженных пар чисел?   -  person Teej    schedule 19.04.2017
comment
Понятно. Мне просто нужно было инициализировать mult перед циклом, а затем проиндексировать его, и теперь все работает отлично.   -  person Teej    schedule 19.04.2017
comment
Да, это правильно. Я не уверен, хотите ли вы написать ответ или позволите мне.   -  person rayryeng    schedule 19.04.2017


Ответы (1)


Я рекомендую вам использовать r=corrcoef(X,Y), это даст вам нормализованное значение r, которое вы ищете в матрице 2x2, и вы можете просто вернуть запись r(2,1) в качестве своего ответа. Это эквивалентно

r=(X-mean(X))*(Y-mean(Y))'/(sqrt(sum((X-mean(X)).^2))*sqrt(sum((Y-mean(Y)).^2)))

Однако, если вы действительно хотите сделать то, что вы упомянули в вопросе, вы также можете сделать

r=(X)*(Y)'/(sqrt(sum((X-mean(X)).^2))*sqrt(sum((Y-mean(Y)).^2)))
person Nirvedh Meshram    schedule 19.04.2017
comment
кажется, что эти функции выводят матрицы с большим количеством значений, чем функция corr. - person Teej; 19.04.2017