Ковариация между двумя матрицами в MATLAB - PullRequest
3 голосов
/ 09 октября 2011

У меня есть две матрицы: X и Y , где каждый столбец представляет несколько реализаций случайной величины;

X = [x_11  x_21  .... x_n1
     x_12  x_22  .... x_n2
      .     .    ....  .
      .     .    ....  .
     x_1m  x_2m  .... x_nm]

И где Y - функцияиз X: Y = f (X)

Y = [y_11  y_21  .... y_n1
     y_12  y_22  .... y_n2
      .     .    ....  .
      .     .    ....  .
     y_1m  y_2m  .... y_nm]

Я хочу найти ковариационную матрицу между переменными x_n и y_n;

E{(X - E{Y}) * (Y - E{Y})^H}

Где () ^ H обозначает Hermitian Transpose вектора

В Matlab, когда я запускаю cov(X,Y) для матриц, (каждые 1000 испытаний по 20 переменным) я получаю только матрицу 2x2 обратно, что приводит меня к мысли, чтоэто как-то обрабатывает каждую матрицу как одну «переменную».Если я соединю две матрицы и вызову cov для результата:

cov( [X Y] )

, я получу матрицу 40x40 с результатом cov( X ) в верхнем левом углу, результатом cov( Y ) ввнизу справа и матрица, которую я хочу, вверху справа и внизу слева, но есть ли способ рассчитать это, не прибегая к этому?

Спасибо

1 Ответ

5 голосов
/ 09 октября 2011

cov(X,Y) эквивалентно cov([x(:) y(:)]).Но [x(:) y(:)] для вас равен 20000 на 2, а cov() рассматривает строки как наблюдения, а столбцы как измерения, поэтому вы получаете ковариационную матрицу 2 на 2.

Я бы сам реализовал это по определению:

bsxfun(@minus,x,mean(x))'*bsxfun(@minus,y,mean(y))/(size(x,1)-1)

Если у вас более старая версия matlab, которая не поддерживает bsxfun(), просто используйте repmat().

...