我有一个矩阵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
和y
时,我更喜欢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 )
沿第一个参数内的矩阵行求和。