как умножить каждый вектор в списке на его транспонирование сразу? - PullRequest
1 голос
/ 07 января 2012

У меня есть список векторов, заданных матрицей, где каждая строка представляет собой вектор x_i. Теперь я хочу сделать следующую матрицу

M = sum_i c_i * (x_i * x_i '- E (x_i * x_i'))

где c_i - это число, а E (x_i * x_i ') = sum_i x_i * x_i' / n, n - количество строк.

Один плохой код для этого -

x = rand(50,10000);
c = rand(10000,1);
M = zeros(50,50);
Y = zeros(50,50);
for i=1:size(x,2)
    M = M + x(:,i)*x(:,i)';
end;
M = M/size(x,2);
for i=1:size(x,2)
    Y = Y + c(i)*(x(:,i)*x(:,i)' - M);
end;

Ответы [ 2 ]

1 голос
/ 07 января 2012

Ваш вопрос не завершен, но вот что-то, что соответствует вашему коду:

M = x*x' / size(x, 2); % first for loop
Y = x*diag(c)*x' - sum(c) * M;

Обратите внимание, что ваш c, вероятно, неправильный.Используйте c = rand(10000,1);, чтобы получить вектор.

0 голосов
/ 07 января 2012

Поскольку умножение на транспонирование - не что иное, как сумма умножений, ответ:

s = sum(x.*x,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...