如何表示为矩阵运算



我有一个矩阵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

我如何纯粹使用矩阵运算来表达这一点?我意识到我可以使用.版本来做到这一点,但我对纯矩阵运算感兴趣。例如,当我有两个向量xy时,我更喜欢x'*y而不是sum(x.*y)。因此,我对如何使用矩阵运算完成上述操作感兴趣。

如果您不想使用向量运算符,则可以通过使用第二个乘法的转置执行矩阵乘法来获得相同的结果(否则在这种情况下,您将获得 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.

你应该使用向量运算

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

.*运算符将矩阵逐个值相乘,而sum( <matrix> , 2 )沿第一个参数内的矩阵行求和。

最新更新