将矩阵的每一行与其转置的自身相乘

时间:2013-11-10 09:03:44

标签: matlab matrix octave

我必须翻译成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,结果有一个矩阵!

5 个答案:

答案 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)(:))