点积与叉积
1. 向量的点积与叉积1.1 向量的点积1.2 向量的叉积
2 矩阵的点积与叉积2.1 矩阵的点积2.2 矩阵的叉积
3. 元素积4. 克罗内克积
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
=a1b1+a2b2
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
=a1b1+a2b2+...+anbn
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
=∣
∣ia1b1ja2b2ka3b3∣
∣=(a2b3−b2a3)i
−(a1b3−b1a3)j
+(a1b2−b1a2)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
=a1b1+a2b2+a3b3
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
=∣
∣ia1b1ja2b2ka3b3∣
∣输出数值(标量):
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=⎣
⎡a11a21⋯am1a12a22⋯am2⋯⋯⋱⋯a1sa2s⋮ams⎦
⎤ B=⎣
⎡b11b21⋯bs1b12b22⋯bs2⋯⋯⋱⋯b1nb2n⋮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=⎣
⎡c11c21⋯cm1c12c22⋯cm2⋯⋯⋱⋯c1nc2n⋮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∑saikbkj举例
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=[1324]B1=[5768],A2=[112233]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}
A1B1=[19432250],A2B2=[1414]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}
[17392353] 其中,
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}
[1414]
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=[1324]B1=[5768],A2=[112233]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=[000000]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
=(a1b1,a2b2,...,anbn)对于同阶矩阵(
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=⎣
⎡a11b11a21b21⋯am1bm1a12b12a22b22⋯am2bm2⋯⋯⋱⋯a1nb1na2nb2n⋮amnbmn⎦
⎤
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=[1324]B1=[5768],A2=[112233]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=[5211232],A2∘B2=[114499]
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=⎣
⎡a11a21⋯am1a12a22⋯am2⋯⋯⋱⋯a1na2n⋮amn⎦
⎤ B=⎣
⎡b11b21⋯bp1b12b22⋯bp2⋯⋯⋱⋯b1qb2q⋮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=⎣
⎡a11Ba21B⋯am1Ba12Ba22B⋯am2B⋯⋯⋱⋯a1nBa2nB⋮amnB⎦
⎤
=
[
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]
=⎣
⎡a11b11a11b21⋮a11bp1⋮⋮am1b11am1b21⋮am1bp1a11b12a11b22⋮a11bp2⋮⋮am1b12am1b22⋮am1bp2⋯⋯⋱⋯⋯⋯⋱⋯a11b1qa11b2q⋮a11bpq⋮⋮am1b1qam1b2q⋮am1bpq⋯⋯⋯⋱⋯⋯⋯⋯⋯⋯⋱⋯⋯⋯a1nb11a1nb21⋮a1nbp1⋮⋮amnb11amnb21⋮amnbp1a1nb12a1nb22⋮a1nbp2⋮⋮amnb12amnb22⋮amnbp2⋯⋯⋱⋯⋯⋯⋱⋯a1nb1qa1nb2q⋮a1nbpq⋮⋮amnb1qamnb2q⋮amnbpq⎦
⎤
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=[1324]B2=[5768]A3=[112233]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=[45681012121518]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=⎣
⎡5715216818241014202812162432⎦
⎤
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=[112233224466336699]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))