我必须翻译成Octave / Matlab的公式是这样的:
\sum (v_i - m) (v_i - m)^T
我有一个矩阵,我需要取每一行,从中减去m
,然后将它与自己的转置相乘。我把内部部分写成函数:
function w = str(v, m)
y = v - m
w = y * transpose(y)
end
我的矩阵是这样的
xx = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
现在我不知道如何将此函数应用于矩阵中的每一行,然后将它们相加到一个新矩阵。也许有人可以帮助我。
编辑:结果是不点积。我正在寻找v * v^T
,结果有一个矩阵!
答案 0 :(得分:1)
可能你需要这个
X = bsxfun( @minus, A, m );
Y = X'* X;
答案 1 :(得分:0)
您可以使用bsxfun
>> v_m = bsxfun( @minus, v, m );
对于所有向量的外积之和,您可以再次使用bsxfun
>> op = bsxfun( @times, permute( v, [3 1 2]), permute( v, [1 3 2] ) );
>> op = sum( op, 3 );
答案 2 :(得分:0)
假设矩阵是A,则解决方案是
total = sum(sum((A-m).*(A-m),2));
A.*A
是一个元素明智的乘法,因此sum(A.*A,2)
返回一个列向量,每个元素都是A
中每行的自点积。
如果m是矢量,则稍微复杂一点。
[p,~]=size(A); total = sum(sum((A-repmat(m,p,1)).*(A-repmat(m,p,1)),2));
干杯。
答案 3 :(得分:0)
最后,我写了这个:
function w = str(v, m)
y = v - m;
w = y' * y;
end
y = zeros(5,5);
for i=1:12
y = y + str(A(i,:), m);
end
当然不是最优雅的方式,但似乎有效。
答案 4 :(得分:0)
有两种方法可以解决此问题:
假设A
是您的矩阵:
sum(drag(A' * A))
将完成这项工作。但是,使用以下命令会更有效:
sum((A .* A)(:))