1

私はマトリックスを持っていますA:

1 3 1
7 5 2
4 3 7
8 2 1
3 9 6
4 5 2

および行列B:

2 9 1
4 3 8
9 7 3
4 4 2
6 5 7
2 9 2

計算したいC

1*2+3*9+1*1
7*4+5*3+2*8
4*9+3*7+7*3
8*4+2*4+1*2
3*6+9*5+6*7
4*2+5*9+2*2

純粋に行列演算を使用してこれを表現するにはどうすればよいですか? バージョンを使用してこれを実行できることはわかってい.ますが、純粋な行列演算に興味があります。たとえば、 と xの2 つのベクトルがある場合、よりyもはるかに好みます。したがって、行列演算を使用して上記を行う方法にも興味があります。x'*ysum(x.*y)

4

2 に答える 2

4

ベクトル演算を使用する必要があります

C = sum( A .* B , 2 );

この.*演算子は、値ごとに行列を乗算しsum( <matrix> , 2 )、最初のパラメーター内の行列の行に沿って合計します。

于 2012-05-18T20:13:05.553 に答える
4

ベクトル演算子を使用したくない場合は、2 番目の被乗数の転置を使用して行列の乗算を実行し (そうしないと、この場合は 3x3 の結果が得られます)、対角線を抽出することで同じ結果を得ることができます。

そのようです:C = diag(A * B')

Octave がこれをどのように最適化するかはよくわかりませんが、要素単位のアプローチよりもわずかに遅いようです。(少なくとも、このデータセットでは)

function test(func, n, a, b)
    for i = 1:n
        func(a, b);
    endfor
endfunction

octave> tic; test(@(a, b) sum(a.*b, 2), 100000, A, B); toc
Elapsed time is 2.843 seconds.

octave> tic; test(@(a, b) diag(a*b'), 100000, A, B); toc
Elapsed time is 3.2 seconds.

注意: 実際の問題は、これが要素単位のアプローチよりもはるかに遅いことを示しています。

octave:100> size(yy)
ans =

   5000     10

octave:101> size(expected)
ans =

   5000     10

octave:102> tic; diag(yy * expected'); toc;
Elapsed time is 0.5447 seconds.
octave:103> tic; sum(yy .* expected, 2); toc;
Elapsed time is 0.0016899 seconds.
于 2012-05-18T20:21:55.347 に答える