如何通过其转置立即乘以列表中的每个向量?

时间:2012-01-06 20:51:41

标签: matlab matrix

我有一个由矩阵给出的向量列表,其中每一行是向量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 个答案:

答案 0 :(得分:1)

您的问题不完整,但这里的内容与您的代码相符:

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

请注意,您的c可能有误。使用c = rand(10000,1);获取矢量。

答案 1 :(得分:0)

由于转置乘法只是乘法的总和,答案是:

s = sum(x.*x,2)