1. 向量的点积与叉积

1.1 向量的点积

数量积又称标量积(Scalar product)、点积(Dot product),在欧几里得空间(Euclidean space)中称为内积(Inner product),对应元素相乘相加,结果是一个标量(即一个数)。

对于向量 a ⃗ = ( a 1 , a 2 ) , b ⃗ = ( b 1 , b 2 ) \vec{a}=\left( {{a}_{1}},{{a}_{2}} \right),\vec{b}=\left( {{b}_{1}},{{b}_{2}} \right) a =(a1​,a2​),b =(b1​,b2​),两者的数量积: a ⃗ ⋅ b ⃗ = a 1 b 1 + a 2 b 2 \vec{a}\cdot \vec{b}= {{a}_{1}}{{b}_{1}}+{{a}_{2}}{{b}_{2}} a ⋅b =a1​b1​+a2​b2​ a ⃗ ⋅ b ⃗ \vec{a}\cdot \vec{b} a ⋅b 的几何意义是 a ⃗ \vec{a} a 在 b ⃗ \vec{b} b 方向上的投影(仅在二维、三维空间向量有意义): a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ c o s θ \vec{a}\cdot \vec{b}=\left| {\vec{a}} \right|* | {\vec{b}} | *cos\theta a ⋅b =∣a ∣∗∣b ∣∗cosθ其中, ∣ a ⃗ ∣ \left| {\vec{a}} \right| ∣a ∣ 、 ∣ b ⃗ ∣ |{\vec{b}}| ∣b ∣分别为向量 a ⃗ \vec{a} a 、 b ⃗ \vec{b} b 的模, θ \theta θ为向量 a ⃗ \vec{a} a 、 b ⃗ \vec{b} b 的夹角。

对于 n n n维向量 a ⃗ = ( a 1 , a 1 , . . . , a n )  , b ⃗ = ( b 1 , b 2 , . . . , b n ) \vec{a}=\left( {{a}_{1}},{{a}_{1}},..., {{a}_{n}} \right)~,\vec{b}=\left( {{b}_{1}},{{b}_{2}} ,...,{{b}_{n}}\right) a =(a1​,a1​,...,an​) ,b =(b1​,b2​,...,bn​),两者的数量积: a ⃗ ⋅ b ⃗ = a 1 b 1 + a 2 b 2 + . . . + a n b n \vec{a}\cdot \vec{b}= {{a}_{1}}{{b}_{1}}+{{a}_{2}}{{b}_{2}}+...+{{a}_{n}}{{b}_{n}} a ⋅b =a1​b1​+a2​b2​+...+an​bn​

numpy中 使用np.dot或numpy.inner()实现向量的点积

举例 a ⃗ = ( 1 , 2 , 3 )          b ⃗ = ( 4 , 5 , 6 ) \vec{a} = (1,2,3) \;\;\;\; \vec{b} = (4,5,6) a =(1,2,3)b =(4,5,6) a ⃗ ⋅ b ⃗ = 1 × 4 + 2 × 5 + 3 × 6 = 32 \vec{a}\cdot \vec{b}= 1\times 4 + 2 \times 5 +3\times 6 = 32 a ⋅b =1×4+2×5+3×6=32

import numpy as np 
a = np.array([1,2,3])
b = np.array([4,5,6])
## 数量积  使用np.dot或np.inner
print(np.dot(a,b))

1.2 向量的叉积

向量积又称矢量积(Vector product)、叉积(Cross product)、外积(Outer product),结果是一个向量。

对于向量 a ⃗ = ( a 1 , a 2 , a 3 )   b ⃗ = ( b 1 , b 2 , b 3 ) \vec{a}=\left( {{a}_{1}},{{a}_{2}}, {{a}_{3}} \right)~\vec{b}=\left( {{b}_{1}},{{b}_{2}} ,{{b}_{3}}\right) a =(a1​,a2​,a3​) b =(b1​,b2​,b3​),两者的叉积为 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 的法向量,该向量垂直于 a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 构成的平面。 a ⃗ × b ⃗ = ∣ i j k a 1 a 2 a 3 b 1 b 2 b 3 ∣ = ( a 2 b 3 − b 2 a 3 ) i ⃗ − ( a 1 b 3 − b 1 a 3 ) j ⃗ + ( a 1 b 2 − b 1 a 2 ) k ⃗ \vec{a} \times \vec{b}= \begin{vmatrix}i & j & k \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ \end{vmatrix} = (a_2b_3-b_2a_3)\vec{i} - (a_1b_3-b_1a_3)\vec{j}+(a_1b_2-b_1a_2)\vec{k} a ×b =∣ ∣​ia1​b1​​ja2​b2​​ka3​b3​​∣ ∣​=(a2​b3​−b2​a3​)i −(a1​b3​−b1​a3​)j ​+(a1​b2​−b1​a2​)k 其中, i , j , k i,j,k i,j,k分别是 X , Y , Z X,Y,Z X,Y,Z轴方向的单位向量.

该向量的模 ∣ a ⃗ × b ⃗ ∣ = ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ s i n θ |\vec{a} \times \vec{b}| =\left| {\vec{a}} \right|*| {\vec{b}} |*sin\theta ∣a ×b ∣=∣a ∣∗∣b ∣∗sinθ其中, ∣ a ⃗ ∣ \left| {\vec{a}} \right| ∣a ∣ 、 ∣ b ⃗ ∣ |{\vec{b}}| ∣b ∣分别为向量 a ⃗ \vec{a} a 、 b ⃗ \vec{b} b 的模, θ \theta θ为向量 a ⃗ \vec{a} a 、 b ⃗ \vec{b} b 的夹角。

即,叉积的长度 ∣ a ⃗ × b ⃗ ∣ |\vec{a} \times \vec{b}| ∣a ×b ∣为向量 a ⃗ \vec{a} a 、 b ⃗ \vec{b} b 共起点时,构成平行四边形的面积。

numpy中 使用np.cross实现向量的叉积

举例 a ⃗ = ( 1 , 2 , 3 )          b ⃗ = ( 4 , 5 , 6 ) \vec{a} = (1,2,3) \;\;\;\; \vec{b} = (4,5,6) a =(1,2,3)b =(4,5,6) a ⃗ ⋅ b ⃗ = ( 2 × 6 − 3 × 5 , 4 × 3 − 1 × 6 , 1 × 5 − 2 × 4 ) = ( − 3 , 6 , − 3 ) \vec{a}\cdot \vec{b}=(2\times 6 -3\times 5 , 4 \times 3 - 1\times 6,1\times 5 - 2 \times 4)=(-3,6,-3) a ⋅b =(2×6−3×5,4×3−1×6,1×5−2×4)=(−3,6,−3)

import numpy as np 
a = np.array([1,2,3])
b = np.array([4,5,6])
## 叉积  使用np.cross
print(np.cross(a,b))

点积与叉积小结:

名称点积/数量积/标量积/内积/叉积/向量积/矢量积/外积
输入(以 R 3 R^3 R3为例) a ⃗ = ( a 1 , a 2 , a 3 ) , b ⃗ = ( b 1 , b 2 , b 3 ) \vec{a}=\left( {{a}_{1}},{{a}_{2}}, {{a}_{3}} \right),\vec{b}=\left( {{b}_{1}},{{b}_{2}} ,{{b}_{3}}\right) a =(a1​,a2​,a3​),b =(b1​,b2​,b3​) a ⃗ = ( a 1 , a 2 , a 3 ) , b ⃗ = ( b 1 , b 2 , b 3 ) \vec{a}=\left( {{a}_{1}},{{a}_{2}}, {{a}_{3}} \right),\vec{b}=\left( {{b}_{1}},{{b}_{2}} ,{{b}_{3}}\right) a =(a1​,a2​,a3​),b =(b1​,b2​,b3​)
运算 a ⃗ ⋅ b ⃗ = a 1 b 1 + a 2 b 2 + a 3 b 3 \vec{a}\cdot \vec{b}= {{a}_{1}}{{b}_{1}}+{{a}_{2}}{{b}_{2}}+{{a}_{3}}{{b}_{3}} a ⋅b =a1​b1​+a2​b2​+a3​b3​ a ⃗ × b ⃗ = ∣ i j k a 1 a 2 a 3 b 1 b 2 b 3 ∣ \vec{a} \times \vec{b}=\begin{vmatrix}i & j & k \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ \end{vmatrix} a ×b =∣ ∣​ia1​b1​​ja2​b2​​ka3​b3​​∣ ∣​
输出数值(标量): a ⃗ \vec{a} a 在 b ⃗ \vec{b} b 方向上的投影与 ∣ b ⃗ ∣ |\vec{b}| ∣b ∣的乘积,即 ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ c o s θ | \vec{a} |* | \vec{b}|*cos\theta ∣a ∣∗∣b ∣∗cosθ向量(矢量): a ⃗ \vec{a} a 和 b ⃗ \vec{b} b 的法向量,该向量的模为 ∣ a ⃗ ∣ ∗ ∣ b ⃗ ∣ ∗ s i n θ | \vec{a} |* | \vec{b}|*sin\theta ∣a ∣∗∣b ∣∗sinθ

注:数量、向量常用于数学;而标量、矢量常用于物理

2 矩阵的点积与叉积

2.1 矩阵的点积

对于 A A A矩阵( m × s m \times s m×s阶), B B B矩阵( s × n s \times n s×n阶)(A的列数与B的行数相等),
A = [ a 11 a 12 ⋯ a 1 s a 21 a 22 ⋯ a 2 s ⋯ ⋯ ⋱ ⋮ a m 1 a m 2 ⋯ a m s ]       B = [ b 11 b 12 ⋯ b 1 n b 21 b 22 ⋯ b 2 n ⋯ ⋯ ⋱ ⋮ b s 1 b s 2 ⋯ b s n ] A=\left[ \begin{matrix} {{a}_{11}} & {{a}_{12}} & \cdots & {{a}_{1s}} \\ {{a}_{21}} & {{a}_{22}} & \cdots & {{a}_{2s}} \\ \cdots & \cdots & \ddots & \vdots \\ {{a}_{m1}} & {{a}_{m2}} & \cdots & {{a}_{ms}} \\ \end{matrix} \right]~~~~~B=\left[ \begin{matrix} {{b}_{11}} & {{b}_{12}} & \cdots & {{b}_{1n}} \\ {{b}_{21}} & {{b}_{22}} & \cdots & {{b}_{2n}} \\ \cdots & \cdots & \ddots & \vdots \\ {{b}_{s1}} & {{b}_{s2}} & \cdots & {{b}_{sn}} \\ \end{matrix} \right] A=⎣ ⎡​a11​a21​⋯am1​​a12​a22​⋯am2​​⋯⋯⋱⋯​a1s​a2s​⋮ams​​⎦ ⎤​     B=⎣ ⎡​b11​b21​⋯bs1​​b12​b22​⋯bs2​​⋯⋯⋱⋯​b1n​b2n​⋮bsn​​⎦ ⎤​两者的点积,即矩阵相乘的结果 C = A B C=AB C=AB是 m × n m\times n m×n阶矩阵,
C = A B = [ c 11 c 12 ⋯ c 1 n c 21 c 22 ⋯ c 2 n ⋯ ⋯ ⋱ ⋮ c m 1 c m 2 ⋯ c m n ] C=AB=\left[ \begin{matrix} {{c}_{11}} & {{c}_{12}} & \cdots & {{c}_{1n}} \\ {{c}_{21}} & {{c}_{22}} & \cdots & {{c}_{2n}} \\ \cdots & \cdots & \ddots & \vdots \\ {{c}_{m1}} & {{c}_{m2}} & \cdots & {{c}_{mn}} \\ \end{matrix} \right] C=AB=⎣ ⎡​c11​c21​⋯cm1​​c12​c22​⋯cm2​​⋯⋯⋱⋯​c1n​c2n​⋮cmn​​⎦ ⎤​其中,矩阵 C C C中的元素满足 c i j = ∑ k = 1 s a i k b k j {{c}_{ij}}=\sum_{k=1}^{s}{{a}_{ik}}{{b}_{kj}} cij​=k=1∑s​aik​bkj​举例 A 1 = [ 1 2 3 4 ]          B 1 = [ 5 6 7 8 ] ,          A 2 = [ 1 2 3 1 2 3 ]          B 2 = [ 1 2 3 ]          A_1 = \begin{bmatrix}1 & 2 \\3 & 4\end{bmatrix}\;\;\;\; B_1 = \begin{bmatrix}5 & 6 \\7 & 8\end{bmatrix}, \;\;\;\; A_2 = \begin{bmatrix}1 & 2 & 3\\1 & 2 & 3\end{bmatrix}\;\;\;\; B_2 = \begin{bmatrix}1\\2\\3 \end{bmatrix} \;\;\;\; A1​=[13​24​]B1​=[57​68​],A2​=[11​22​33​]B2​=⎣ ⎡​123​⎦ ⎤​ A 1 B 1 = [ 19 22 43 50 ] ,          A 2 B 2 = [ 14 14 ] A_1B_1 = \begin{bmatrix}19 & 22 \\43 & 50\end{bmatrix}, \;\;\;\; A_2B_2 = \begin{bmatrix}14&14\end{bmatrix} A1​B1​=[1943​2250​],A2​B2​=[14​14​]numpy实现

import numpy as np 
A1 = np.array([[1,2],[3,4]])
B2 = np.array([[5,6],[7,8]])
A2 = np.array([[1,2,3],[1,2,3]])
B2 = np.array([1,2,3])
## 数量积  使用np.dot
print(np.dot(A1,B1))
print(np.dot(A2,B2))

此外,numpyt提供了numpy.inner()函数,从字面意思理解是内积,其针对向量numpy.inner()与numpy.dot()输出一致,但针对矩阵有所不同。

print(np.inner(A1,B1))

输出为 [ 17 23 39 53 ] \begin{bmatrix}17 & 23 \\39 & 53\end{bmatrix} [1739​2353​]
其中, 17 = 1 × 5 + 2 × 6 , 23 = 1 × 7 + 2 × 8 17=1 \times 5 +2\times 6,23 = 1\times 7 +2\times 8 17=1×5+2×6,23=1×7+2×8 39 = 3 × 5 + 4 × 6 , 53 = 3 × 7 + 4 × 8 39 = 3\times 5 +4\times 6,53=3\times7 +4\times 8 39=3×5+4×6,53=3×7+4×8

print(np.inner(A2,B2))

输出为 [ 14 14 ] \begin{bmatrix}14&14\end{bmatrix} [14​14​]

2.2 矩阵的叉积

针对矩阵并不存在叉积的概念,numpy中针对矩阵的叉积运算是按照向量的叉积进行运算。

举例
A 1 = [ 1 2 3 4 ]          B 1 = [ 5 6 7 8 ] ,          A 2 = [ 1 2 3 1 2 3 ]          B 2 = [ 1 2 3 ]          A_1 = \begin{bmatrix}1 & 2 \\3 & 4\end{bmatrix}\;\;\;\; B_1 = \begin{bmatrix}5 & 6 \\7 & 8\end{bmatrix}, \;\;\;\; A_2 = \begin{bmatrix}1 & 2 & 3\\1 & 2 & 3\end{bmatrix}\;\;\;\; B_2 = \begin{bmatrix}1\\2\\3 \end{bmatrix} \;\;\;\; A1​=[13​24​]B1​=[57​68​],A2​=[11​22​33​]B2​=⎣ ⎡​123​⎦ ⎤​ A 1 × B 1 = [ − 4 − 4 ] ,          A 2 × B 2 = [ 0 0 0 0 0 0 ] A_1 \times B_1 = \begin{bmatrix}-4&-4\end{bmatrix}, \;\;\;\; A_2 \times B_2 = \begin{bmatrix}0 & 0&0 \\0 & 0&0\end{bmatrix} A1​×B1​=[−4​−4​],A2​×B2​=[00​00​00​]numpy实现

import numpy as np 
A1 = np.array([[1,2],[3,4]])
B1 = np.array([[5,6],[7,8]])
A2 = np.array([[1,2,3],[1,2,3]])
B2 = np.array([1,2,3])
## 叉积  使用np.cross
print(np.cross(A1,B1))
print(np.cross(A2,B2))

3. 元素积

元素积(element-wise product, point-wise product)又称哈达玛积(Hadamard product )、舒尔积、逐项积,对应元素相乘,结果还是向量/矩阵。

对于 n n n维向量 a ⃗ = ( a 1 , a 1 , . . . , a n )  , b ⃗ = ( b 1 , b 2 , . . . , b n ) \vec{a}=\left( {{a}_{1}},{{a}_{1}},..., {{a}_{n}} \right)~,\vec{b}=\left( {{b}_{1}},{{b}_{2}} ,...,{{b}_{n}}\right) a =(a1​,a1​,...,an​) ,b =(b1​,b2​,...,bn​),两者的元素积: a ⃗ ∗ b ⃗ = ( a 1 b 1 , a 2 b 2 , . . . , a n b n ) \vec{a} * \vec{b}= ({{a}_{1}{b}_{1}},{{a}_{2}}{{b}_{2}},...,{{a}_{n}}{{b}_{n}} ) a ∗b =(a1​b1​,a2​b2​,...,an​bn​)对于同阶矩阵( m × n m \times n m×n) A A A、 B B B,两者的哈达玛(Hadamard)积: A ∘ B = [ a 11 b 11 a 12 b 12 ⋯ a 1 n b 1 n a 21 b 21 a 22 b 22 ⋯ a 2 n b 2 n ⋯ ⋯ ⋱ ⋮ a m 1 b m 1 a m 2 b m 2 ⋯ a m n b m n ] A \circ B = \left[ \begin{matrix} {{a}_{11}{b}_{11}} & {{a}_{12}{b}_{12}} & \cdots & {{a}_{1n}{b}_{1n}} \\ {{a}_{21}{b}_{21}} & {{a}_{22}{b}_{22}} & \cdots & {{a}_{2n}{b}_{2n}} \\ \cdots & \cdots & \ddots & \vdots \\ {{a}_{m1}{b}_{m1}} & {{a}_{m2}{b}_{m2}} & \cdots & {{a}_{mn}{b}_{mn}} \\ \end{matrix} \right] A∘B=⎣ ⎡​a11​b11​a21​b21​⋯am1​bm1​​a12​b12​a22​b22​⋯am2​bm2​​⋯⋯⋱⋯​a1n​b1n​a2n​b2n​⋮amn​bmn​​⎦ ⎤​

numpy中 使用np.multiply或*实现元素积

举例

向量: a ⃗ = ( 1 , 2 , 3 )          b ⃗ = ( 4 , 5 , 6 ) \vec{a} = (1,2,3) \;\;\;\; \vec{b} = (4,5,6) a =(1,2,3)b =(4,5,6) a ⃗ ∘ b ⃗ = ( 4 , 10 , 18 ) \vec{a} \circ \vec{b} =(4 , 10 , 18) a ∘b =(4,10,18)矩阵: A 1 = [ 1 2 3 4 ]          B 1 = [ 5 6 7 8 ] ,          A 2 = [ 1 2 3 1 2 3 ]          B 2 = [ 1 2 3 ]          A_1 = \begin{bmatrix}1 & 2 \\3 & 4\end{bmatrix}\;\;\;\; B_1 = \begin{bmatrix}5 & 6 \\7 & 8\end{bmatrix}, \;\;\;\; A_2 = \begin{bmatrix}1 & 2 & 3\\1 & 2 & 3\end{bmatrix}\;\;\;\; B_2 = \begin{bmatrix}1\\2\\3 \end{bmatrix} \;\;\;\; A1​=[13​24​]B1​=[57​68​],A2​=[11​22​33​]B2​=⎣ ⎡​123​⎦ ⎤​ A 1 ∘ B 1 = [ 5 12 21 32 ] ,          A 2 ∘ B 2 = [ 1 4 9 1 4 9 ]          A_1 \circ B_1 = \begin{bmatrix}5 & 12 \\21 & 32\end{bmatrix}, \;\;\;\; A_2 \circ B_2 = \begin{bmatrix}1 & 4 & 9\\1 & 4 & 9\end{bmatrix}\;\;\;\; A1​∘B1​=[521​1232​],A2​∘B2​=[11​44​99​]

import numpy as np 
a = np.array([1,2,3])
b = np.array([4,5,6])
A1 = np.array([[1,2],[3,4]])
B1 = np.array([[5,6],[7,8]])
A2 = np.array([[1,2,3],[1,2,3]])
B2 = np.array([1,2,3])
## 数量积  使用np.multiply或*
print(np.multiply(a,b))
print(np.multiply(A1,B1))
print(np.multiply(A2,B2)) #阶数不一致的,numpy将进行广播确保一致

4. 克罗内克积

克罗内克积(Kronecker product)是两个任意大小的矩阵间的运算。

对于对于 A A A矩阵( m × n m \times n m×n阶), B B B矩阵( p × q p \times q p×q阶): A = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ]       B = [ b 11 b 12 ⋯ b 1 q b 21 b 22 ⋯ b 2 q ⋯ ⋯ ⋱ ⋮ b p 1 b p 2 ⋯ b p q ] A=\left[ \begin{matrix} {{a}_{11}} & {{a}_{12}} & \cdots & {{a}_{1n}} \\ {{a}_{21}} & {{a}_{22}} & \cdots & {{a}_{2n}} \\ \cdots & \cdots & \ddots & \vdots \\ {{a}_{m1}} & {{a}_{m2}} & \cdots & {{a}_{mn}} \\ \end{matrix} \right]~~~~~B=\left[ \begin{matrix} {{b}_{11}} & {{b}_{12}} & \cdots & {{b}_{1q}} \\ {{b}_{21}} & {{b}_{22}} & \cdots & {{b}_{2q}} \\ \cdots & \cdots & \ddots & \vdots \\ {{b}_{p1}} & {{b}_{p2}} & \cdots & {{b}_{pq}} \\ \end{matrix} \right] A=⎣ ⎡​a11​a21​⋯am1​​a12​a22​⋯am2​​⋯⋯⋱⋯​a1n​a2n​⋮amn​​⎦ ⎤​     B=⎣ ⎡​b11​b21​⋯bp1​​b12​b22​⋯bp2​​⋯⋯⋱⋯​b1q​b2q​⋮bpq​​⎦ ⎤​两者的克罗内克积 C = A ⊗ B C=A \otimes B C=A⊗B是 m p × n q mp×nq mp×nq阶的分块矩阵: C = A ⊗ B = [ a 11 B a 12 B ⋯ a 1 n B a 21 B a 22 B ⋯ a 2 n B ⋯ ⋯ ⋱ ⋮ a m 1 B a m 2 B ⋯ a m n B ] C=A \otimes B = \left[ \begin{matrix} {{a}_{11}B} & {{a}_{12}B} & \cdots & {{a}_{1n}} B \\ {{a}_{21}} B& {{a}_{22}}B & \cdots & {{a}_{2n}} B \\ \cdots & \cdots & \ddots & \vdots \\ {{a}_{m1}} B& {{a}_{m2}} B& \cdots & {{a}_{mn}}B \\ \end{matrix} \right] C=A⊗B=⎣ ⎡​a11​Ba21​B⋯am1​B​a12​Ba22​B⋯am2​B​⋯⋯⋱⋯​a1n​Ba2n​B⋮amn​B​⎦ ⎤​ = [ a 11 b 11 a 11 b 12 ⋯ a 11 b 1 q ⋯ ⋯ a 1 n b 11 a 1 n b 12 ⋯ a 1 n b 1 q a 11 b 21 a 11 b 22 ⋯ a 11 b 2 q ⋯ ⋯ a 1 n b 21 a 1 n b 22 ⋯ a 1 n b 2 q ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a 11 b p 1 a 11 b p 2 ⋯ a 11 b p q ⋯ ⋯ a 1 n b p 1 a 1 n b p 2 ⋯ a 1 n b p q ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ a m 1 b 11 a m 1 b 12 ⋯ a m 1 b 1 q ⋯ ⋯ a m n b 11 a m n b 12 ⋯ a m n b 1 q a m 1 b 21 a m 1 b 22 ⋯ a m 1 b 2 q ⋯ ⋯ a m n b 21 a m n b 22 ⋯ a m n b 2 q ⋮ ⋮ ⋱ ⋮ ⋮ ⋮ ⋱ ⋮ a m 1 b p 1 a m 1 b p 2 ⋯ a m 1 b p q ⋯ ⋯ a m n b p 1 a m n b p 2 ⋯ a m n b p q ] =\left[ \begin{matrix} {{a}_{11}{b}_{11}} & {{a}_{11}{b}_{12}} & \cdots & {{a}_{11}} {b}_{1q} & \cdots & \cdots &{{a}_{1n}{b}_{11}} & {{a}_{1n}{b}_{12}} & \cdots & {{a}_{1n}} {b}_{1q} \\ {{a}_{11}{b}_{21}} & {{a}_{11}{b}_{22}} & \cdots & {{a}_{11}} {b}_{2q} & \cdots & \cdots &{{a}_{1n}{b}_{21}} & {{a}_{1n}{b}_{22}} & \cdots & {{a}_{1n}} {b}_{2q} \\ \vdots & \vdots & \ddots & \vdots & & & \vdots & \vdots & \ddots & \vdots \\ {{a}_{11}{b}_{p1}} & {{a}_{11}{b}_{p2}} & \cdots & {{a}_{11}} {b}_{pq} & \cdots & \cdots &{{a}_{1n}{b}_{p1}} & {{a}_{1n}{b}_{p2}} & \cdots & {{a}_{1n}} {b}_{pq} \\ \vdots & \vdots & & \vdots & \ddots & & \vdots & \vdots & & \vdots \\ \vdots & \vdots & & \vdots & & \ddots & \vdots & \vdots & & \vdots \\ {{a}_{m1}{b}_{11}} & {{a}_{m1}{b}_{12}} & \cdots & {{a}_{m1}} {b}_{1q} & \cdots & \cdots &{{a}_{mn}{b}_{11}} & {{a}_{mn}{b}_{12}} & \cdots & {{a}_{mn}} {b}_{1q} \\ {{a}_{m1}{b}_{21}} & {{a}_{m1}{b}_{22}} & \cdots & {{a}_{m1}} {b}_{2q} & \cdots & \cdots &{{a}_{mn}{b}_{21}} & {{a}_{mn}{b}_{22}} & \cdots & {{a}_{mn}} {b}_{2q} \\ \vdots & \vdots & \ddots & \vdots & & & \vdots & \vdots & \ddots & \vdots \\ {{a}_{m1}{b}_{p1}} & {{a}_{m1}{b}_{p2}} & \cdots & {{a}_{m1}} {b}_{pq} & \cdots & \cdots &{{a}_{mn}{b}_{p1}} & {{a}_{mn}{b}_{p2}} & \cdots & {{a}_{mn}} {b}_{pq} \\ \end{matrix} \right] =⎣ ⎡​a11​b11​a11​b21​⋮a11​bp1​⋮⋮am1​b11​am1​b21​⋮am1​bp1​​a11​b12​a11​b22​⋮a11​bp2​⋮⋮am1​b12​am1​b22​⋮am1​bp2​​⋯⋯⋱⋯⋯⋯⋱⋯​a11​b1q​a11​b2q​⋮a11​bpq​⋮⋮am1​b1q​am1​b2q​⋮am1​bpq​​⋯⋯⋯⋱⋯⋯⋯​⋯⋯⋯⋱⋯⋯⋯​a1n​b11​a1n​b21​⋮a1n​bp1​⋮⋮amn​b11​amn​b21​⋮amn​bp1​​a1n​b12​a1n​b22​⋮a1n​bp2​⋮⋮amn​b12​amn​b22​⋮amn​bp2​​⋯⋯⋱⋯⋯⋯⋱⋯​a1n​b1q​a1n​b2q​⋮a1n​bpq​⋮⋮amn​b1q​amn​b2q​⋮amn​bpq​​⎦ ⎤​

numpy中 使用np.kron实现

举例 A 1 = [ 1 2 3 ]    B 1 = [ 4 5 6 ]    A 2 = [ 1 2 3 4 ]    B 2 = [ 5 6 7 8 ]    A 3 = [ 1 2 3 1 2 3 ]    B 3 = [ 1 2 3 ] A_1 = \begin{bmatrix}1 \\ 2\\ 3 \end{bmatrix}\;B_1 = \begin{bmatrix}4\\5\\6 \end{bmatrix} \;A_2 = \begin{bmatrix}1 & 2 \\3 & 4\end{bmatrix}\;B_2 = \begin{bmatrix}5 & 6 \\7 & 8\end{bmatrix} \; A_3 = \begin{bmatrix}1 & 2 & 3\\1 & 2 & 3\end{bmatrix}\;B_3 = \begin{bmatrix}1\\2\\3 \end{bmatrix} A1​=⎣ ⎡​123​⎦ ⎤​B1​=⎣ ⎡​456​⎦ ⎤​A2​=[13​24​]B2​=[57​68​]A3​=[11​22​33​]B3​=⎣ ⎡​123​⎦ ⎤​ A 1 ⊗ B 1 = [ 4 5 6 8 10 12 12 15 18 ] T A_1 \otimes B_1={\begin{bmatrix}4 & 5 & 6 & 8 &10 & 12 & 12 & 15&18\end{bmatrix}}^T A1​⊗B1​=[4​5​6​8​10​12​12​15​18​]T A 2 ⊗ B 2 = [ 5 6 10 12 7 8 14 16 15 18 20 24 21 24 28 32 ] A_2 \otimes B_2 = \begin{bmatrix}5 &6&10&12 \\7 & 8&14&16\\15 & 18&20&24 \\21 &24&28&32\end{bmatrix} A2​⊗B2​=⎣ ⎡​571521​681824​10142028​12162432​⎦ ⎤​ A 3 ⊗ B 3 = [ 1 2 3 2 4 6 3 6 9 1 2 3 2 4 6 3 6 9 ] T A_3\otimes B_3 = { \begin{bmatrix}1 & 2&3 &2&4&6&3&6 & 9\\1 & 2&3 &2&4&6&3&6 & 9\end{bmatrix}}^T A3​⊗B3​=[11​22​33​22​44​66​33​66​99​]T

import numpy as np 
A1 = np.array([1,2,3])
B1 = np.array([4,5,6])
A2 = np.array([[1,2],[3,4]])
B2 = np.array([[5,6],[7,8]])
A3 = np.array([[1,2,3],[1,2,3]])
B3 = np.array([1,2,3])
## 克罗内克积  使用np.kron
print(np.kron(A1,B1))
print(np.kron(A2,B2))
print(np.kron(A3,B3))
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐