-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

行列を A とすると、解は次のようになります。

    合計 = 合計 (合計 ((午前).*(午前),2));

A.*Aは要素単位の乗算であるためsum(A.*A,2)、列ベクトルを返します。各要素は の各行の自己内積ですA

m がベクトルの場合、少し複雑になります。

    [p,~]=サイズ(A);
    合計 = 合計 (合計 ((A-repmat(m,p,1)).*(A-repmat(m,p,1)),2));

乾杯。

于 2013-11-10T09:19:46.270 に答える
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

を使用して平均を減算できます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 に答える