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