我有一个矩阵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)
。因此,我对如何使用矩阵运算进行上述操作感兴趣。
答案 0 :(得分:4)
你应该使用矢量运算
C = sum( A .* B , 2 );
.*
运算符将值逐位乘以矩阵,而sum( <matrix> , 2 )
则沿第一个参数内的矩阵行求和。
答案 1 :(得分:4)
如果您不想使用向量运算符,可以通过使用 second 被乘数的转置执行矩阵乘法来获得相同的结果(否则您将获得3x3结果,在此case),然后提取对角线。
像这样: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.