矩阵和向量点乘叉乘元素乘
Date: 2025.01.07
Author: Xin Pan
回顾下矩阵和向量的各种乘法。
向量
点乘
又叫做点积、内积、数量积、标量积。 a = [ a 1 , a 2 , . . . , a n ] a=[a_1,a_2,...,a_n] a=[a1,a2,...,an]和 b = [ b 1 , b 2 , . . . , b n ] b=[b_1,b_2,...,b_n] b=[b1,b2,...,bn]点乘的结果是一个标量,记作 a . b a.b a.b
a . b = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + . . . + a n b n a.b=\sum_{i=1}^na_ib_i=a_1b_1+a_2b_2+...+a_nb_n a.b=∑i=1naibi=a1b1+a2b2+...+anbn
叉乘
又叫向量积、外积、叉积,叉乘, a = [ a 1 , a 2 , . . . , a n ] a=[a_1,a_2,...,a_n] a=[a1,a2,...,an]和 b = [ b 1 , b 2 , . . . , b n ] b=[b_1,b_2,...,b_n] b=[b1,b2,...,bn]叉乘的运算结果是一个向量,并且两个向量的叉积与这两个向量组成的坐标平面垂直,记作 a x b axb axb
a x b = ( a 2 b 3 − b 2 a 3 , − a 1 b 3 + b 1 a 3 , a 1 b 2 − b 1 a 2 ) axb=(a_2b_3-b_2a_3,-a_1b_3+b_1a_3,a_1b_2-b_1a_2) axb=(a2b3−b2a3,−a1b3+b1a3,a1b2−b1a2)
元素乘(我自己起的名,为了方便理解)
对应位置元素相成,维度不变。
import numpy as np
if __name__ == "__main__":
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(f"Dot={np.dot(a,b)}")
print(f"Cross={np.cross(a,b)}")
print(f"@ times={a@b}")
print(f"* times={a*b}")
print(f"np.multiply={np.multiply(a,b)}")
结果
Dot=32
Cross=[-3 6 -3]
@ times=32
* times=[ 4 10 18]
np.multiply=[ 4 10 18]
矩阵
点乘
是矩阵各个对应元素相乘, 这个时候要求两个矩阵必须同样大小。做的事和向量的元素乘一样的。可以直接使用星号(*)进行表示。
叉乘
矩阵的乘法就是矩阵a的第m行乘以矩阵b的第n列,各个元素对应相乘然后求和作为第m行n列元素的值。使用np.dot函数执行,也可以使用@计算。
元素乘(我自己起的名,为了方便理解)
和矩阵点乘做的是一样的事情。
import numpy as np
if __name__ == "__main__":
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
print(f"Dot={np.dot(a,b.T)}")
print(f"Cross={np.cross(a,b)}")
print(f"@ times={a@b.T}")
print(f"* times={a*b}")
print(f"np.multiply={np.multiply(a,b)}")
结果
Dot=[[ 50 68]
[122 167]]
Cross=[[-6 12 -6]
[-6 12 -6]]
@ times=[[ 50 68]
[122 167]]
* times=[[ 7 16 27]
[40 55 72]]
np.multiply=[[ 7 16 27]
[40 55 72]]
总结
维度 | 点乘结果 | 叉乘结果 | 元素乘结果 | |
---|---|---|---|---|
向量 | [1,N] 或 [N,1] | 数 | 向量 | 向量 |
矩阵 | [M,N] M,N可能一致 | 矩阵 | 矩阵 | 矩阵 |
维度 | 点乘表示 | 叉乘表示 | 元素乘表示 | |
---|---|---|---|---|
向量 | [1,N] 或 [N,1] | np.dot or @ | np.cross | * or multiply |
矩阵 | [M,N] M,N可能一致 | * or multiply | np.dot or @ | * or multiply |