-2

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

4

5 回答 5

1

可能你需要这个

X = bsxfun( @minus, A, m );
Y = X'* X;
于 2013-11-10T09:41:43.077 回答
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

当然不是最优雅的方式来做到这一点,但它似乎工作。

于 2013-11-10T09:35:44.553 回答
0

假设矩阵为A,则解为

    总计=总和(总和((Am)。*(Am),2));

A.*A是逐元素乘法,因此sum(A.*A,2)返回一个列向量,其中每个元素是 中每一行的自点积A

如果 m 是一个向量,那么它会稍微复杂一些。

    [p,~]=大小(A);
    总计 = sum(sum((A-repmat(m,p,1)).*(A-repmat(m,p,1)),2));

干杯。

于 2013-11-10T09:19:46.270 回答
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 );
于 2013-11-10T09:16:37.193 回答
0

有两种方法可以解决这个问题:

假设A你的矩阵:

sum(drag(A' * A))

将完成这项工作。但是,使用以下方法会更有效:

sum((A .* A)(:))
于 2020-07-30T18:16:05.883 回答