假设我有两个矩阵:M
是 2x3 的,而 C
是 3x4 的...
import numpy as np
M = np.matrix([ [1,2,3], [4,5,6]])
C = np.matrix([ [1,1,2,2], [1,2,1,2], [2,1,1,1]])
我需要将这些矩阵相乘,以得到一个大小为2x4的结果。使用np.dot(M, C)
很容易实现,但我想要将向量积相乘而不是相加。
例如,常规点积可以这样计算:
result[0,0] = (M[0,0]*C[0,0]) + (M[0,1]*C[1,0]) + (M[0,2]*C[2,0])
# result[0,0] = (1*1) + (2*1) + (3*2)
# result[0,0] = 9
我只是想用乘号替换加号...
result[0,0] = (M[0,0]*C[0,0]) * (M[0,1]*C[1,0]) * (M[0,2]*C[2,0])
# result[0,0] = (1*1) * (2*1) * (3*2)
# result[0,0] = 12
我的最佳解决方案依赖于循环处理 M
的行 --
result = np.empty( (2,4) )
for i in range(2):
result[i,:] = np.prod(np.multiply(np.tile(M[i,:].T , (1,4)), C) , axis=0)
将其分解,
M
的每一行被转置,然后使用np.tile
进行平铺,使其与C
大小相同(即3x4)。 然后逐个元素地乘以矩阵,并取每列的乘积。在我正在编写的实际程序中,
M
和C
不一定是整数,可以是任意大小,并且这个计算要执行很多次。 我想知道是否有一种快速且易于阅读的方法来完成这项工作。更新
@Warren Weckesser提供了一个很好的解决方案。 但现在我面临一个新的挑战-具体而言,如果我想在乘以它们之前从向量积中减去一个数字怎么办?
在早期的解决方案中,可以这样做:
result1 = np.empty( (2,4) )
for i in range(2):
result1[i,:] = np.prod( 1 - np.multiply( np.tile(M[i,:].T , (1,4)), C) , axis=0)
我已经尝试了@Warren Weckesser提供的解决方案,但都没有成功。我非常希望能够找到更加优雅的解决方案!