在本篇文章中将深入探讨 NumPy 库中矩阵点乘与叉乘的具体运算法则。
点乘(Element-wise multiplication)
对于两个维度完全一样的矩阵用 multiply 做乘法,那么它们就是进行对应位置元素之间的乘法(Element-Wise Product),得到一个同样维度的矩阵输出,用符号 .*
表示(等价于 numpy
中的 *
符号)。
⎣⎢⎡a11a21a31a12a22a32a13a23a33⎦⎥⎤.∗⎣⎢⎡b11b21b31b12b22b32b13b23b33⎦⎥⎤=⎣⎢⎡a11b11a21b21a31b31a12b12a22b22a32b32a13b13a23b23a33b33⎦⎥⎤
标量 .* 向量 or 矩阵(Scalar .* Vector or Matrix)
设有行向量 a=[1,2,3],将其转置得到 aT=⎣⎢⎡123⎦⎥⎤, 和矩阵 M=⎣⎢⎡147258369⎦⎥⎤。标量点乘向量或矩阵,则代表标量乘向量或矩阵中的每一个元素,在这种情况下左乘和右乘是等价的。
【例子】
2.∗a=2.∗[1,2,3]=[2,4,6]
2.∗aT=2.∗⎣⎢⎡123⎦⎥⎤=⎣⎢⎡246⎦⎥⎤
2.∗M=2.∗⎣⎢⎡147258369⎦⎥⎤=⎣⎢⎡28144101661218⎦⎥⎤
矩阵 .* 矩阵 (Matrix .* Matrix)
设有矩阵 M=⎣⎢⎡147258369⎦⎥⎤,矩阵之间的点乘仅支持维度完全相同的两个矩阵相乘,其本质为两个矩阵对应元素相乘,在这种情况下左乘和右乘是等价的。
M.∗M=⎣⎢⎡147258369⎦⎥⎤.∗⎣⎢⎡147258369⎦⎥⎤=⎣⎢⎡116494256493681⎦⎥⎤
向量 .* 向量 (Vector .* Vector)
设有行向量 a=[1,2,3],b=[4,5,6],c=[1,2]。若两个维度相同的向量点乘,则代表对应位置的元素对应相乘,若两个向量方向不同(一个为行向量,一个为列向量)则对各自长度不做要求,分别补齐成相同形状后对应元素相乘。在这种情况下左乘和右乘是等价的。
a.∗b=[1,2,3].∗[4,5,6]=[4,10,18]
c.∗bT=[1,2].∗⎣⎢⎡456⎦⎥⎤=⎣⎢⎡111222⎦⎥⎤.∗⎣⎢⎡456456⎦⎥⎤=⎣⎢⎡45681012⎦⎥⎤
cT.∗b=[12].∗[4,5,6]=[121212].∗[445566]=[48510612]
向量 .* 矩阵 (Vector .* Matrix or Matrix .* Vector)
(这里的沿用数学书写习惯使用“.*
”代表 NumPy 中的“*
”)
设有行向量 a=[1,2,3], 和矩阵 M=[142536]。如果是行向量和矩阵点乘,则其长度必须和矩阵的列数相同,纵向补齐成和矩阵维度相同后对应元素相乘;如果是列向量和矩阵点乘,则其长度必须和矩阵的行数相同,横向补齐成和矩阵维度相同后对应元素相乘。在这种情况下左乘和右乘是等价的。
a.∗M=[1,2,3].∗[142536]=[112233].∗[142536]=[14410918]
aT.∗MT=⎣⎢⎡123⎦⎥⎤.∗⎣⎢⎡123456⎦⎥⎤=⎣⎢⎡123123⎦⎥⎤.∗⎣⎢⎡123456⎦⎥⎤=⎣⎢⎡14941018⎦⎥⎤
a.∗MT=[1,2,3].∗⎣⎢⎡123456⎦⎥⎤=Invalid
aT.∗M=⎣⎢⎡123⎦⎥⎤.∗[142536]=Invalid
M.∗a=[142536].∗[1,2,3]=[142536].∗[112233]=[14410918]
MT.∗aT=⎣⎢⎡123456⎦⎥⎤.∗⎣⎢⎡123⎦⎥⎤=⎣⎢⎡123456⎦⎥⎤.∗⎣⎢⎡123123⎦⎥⎤=⎣⎢⎡14941018⎦⎥⎤
MT.∗a=⎣⎢⎡123456⎦⎥⎤.∗[1,2,3]=Invalid
M.∗aT=[142536].∗⎣⎢⎡123⎦⎥⎤=Invalid
叉乘(dot)
矩阵叉乘,m×n矩阵乘以 n×k矩阵会得到一个 m×k 的矩阵,用符号 *
表示(等价于 numpy
中的 @
符号)。
Am×n∗Bn×k=Cm×k
标量 * 向量 or 矩阵(Scalar * Vector or Matrix)
标量作为一个维度为 1×1 的矩阵,按照矩阵乘法仅支持右乘行向量,或左乘列向量。设有行向量 a=[1,2,3],将其转置得到列向量 aT=⎣⎢⎡123⎦⎥⎤,
2(1×1)∗a(1×3)=2∗[1,2,3]=[2,4,6]
aT(3×1)∗2(1×1)=⎣⎢⎡123⎦⎥⎤∗2=⎣⎢⎡246⎦⎥⎤
矩阵 * 矩阵 (Matrix * Matrix)
设有矩阵 M1=[142536],M2=⎣⎢⎡135246⎦⎥⎤。这种情况下按照矩阵运算法则进行计算。
M1(2×3)∗M2(3×2)=[142536]∗⎣⎢⎡135246⎦⎥⎤=[22492864]
M1T(3×2)∗M2T(2×3)=⎣⎢⎡123456⎦⎥⎤∗[123456]=⎣⎢⎡91215192633294051⎦⎥⎤
向量 * 向量 (Vector * Vector)
设有行向量 a=[1,2,3],b=[4,5,6]。这种情况下按照矩阵运算法则进行计算。
a(1×3)∗bT(3×1)=[1,2,3]∗⎣⎢⎡456⎦⎥⎤=32
aT(3×1)∗b(1×3)=⎣⎢⎡123⎦⎥⎤∗[4,5,6]=⎣⎢⎡48125101561218⎦⎥⎤
向量 * 矩阵 (Vector * Matrix or Matrix * Vector)
设有行向量 a=[1,2,3], 和矩阵 M=[142536]。这种情况下按照矩阵运算法则进行计算。
a(1×3)∗MT(3×2)=[1,2,3]∗⎣⎢⎡135246⎦⎥⎤=[14,32]
M(2×3)∗aT(3×1)=[142536]∗⎣⎢⎡123⎦⎥⎤=[1432]