设
n
,
m
,
l
∈
n,m,l\in
n,m,l∈ℕ,
P
P
P为一数域。
∀
A
=
(
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋯
⋮
a
m
1
a
m
2
⋯
a
m
n
)
∈
P
m
×
n
\forall\boldsymbol{A}=\begin{pmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\ a_{21}&a_{22}&\cdots&a_{2n}\\ \vdots&\vdots&\cdots&\vdots\\ a_{m1}&a_{m2}&\cdots&a_{mn}\end{pmatrix}\in P^{m\times n}
∀A=
a11a21⋮am1a12a22⋮am2⋯⋯⋯⋯a1na2n⋮amn
∈Pm×n,
B
=
(
b
11
b
12
⋯
b
1
l
b
21
b
22
⋯
b
2
l
⋮
⋮
⋯
⋮
b
n
1
b
n
2
⋯
b
n
l
)
∈
P
n
×
l
\boldsymbol{B}=\begin{pmatrix}b_{11}&b_{12}&\cdots&b_{1l}\\ b_{21}&b_{22}&\cdots&b_{2l}\\ \vdots&\vdots&\cdots&\vdots\\ b_{n1}&b_{n2}&\cdots&b_{nl}\end{pmatrix}\in P^{n\times l}
B=
b11b21⋮bn1b12b22⋮bn2⋯⋯⋯⋯b1lb2l⋮bnl
∈Pn×l,定义
A
\boldsymbol{A}
A与
B
\boldsymbol{B}
B的积运算
∘
\circ
∘为:
C
=
A
∘
B
=
(
∑
k
=
1
n
a
1
k
b
k
1
∑
k
=
1
n
a
1
k
b
k
2
⋯
∑
k
=
1
n
a
1
k
b
k
l
∑
k
=
1
n
a
2
k
b
k
1
∑
k
=
1
n
a
2
k
b
k
2
⋯
∑
k
=
1
n
a
2
k
b
k
l
⋮
⋮
⋯
⋮
∑
k
=
1
n
a
m
k
b
k
1
∑
k
=
1
n
a
m
k
b
k
2
⋯
∑
k
=
1
n
a
m
k
b
k
l
)
m
×
l
∈
P
m
×
l
.
\boldsymbol{C}=\boldsymbol{A}\circ\boldsymbol{B}=\begin{pmatrix}\sum\limits_{k=1}^na_{1k}b_{k1}&\sum\limits_{k=1}^na_{1k}b_{k2}&\cdots&\sum\limits_{k=1}^na_{1k}b_{kl}\\ \sum\limits_{k=1}^na_{2k}b_{k1}&\sum\limits_{k=1}^na_{2k}b_{k2}&\cdots&\sum\limits_{k=1}^na_{2k}b_{kl}\\ \vdots&\vdots&\cdots&\vdots\\ \sum\limits_{k=1}^na_{mk}b_{k1}&\sum\limits_{k=1}^na_{mk}b_{k2}&\cdots&\sum\limits_{k=1}^na_{mk}b_{kl}\end{pmatrix}_{m\times l}\in P^{m\times l}.
C=A∘B=
k=1∑na1kbk1k=1∑na2kbk1⋮k=1∑namkbk1k=1∑na1kbk2k=1∑na2kbk2⋮k=1∑namkbk2⋯⋯⋯⋯k=1∑na1kbklk=1∑na2kbkl⋮k=1∑namkbkl
m×l∈Pm×l.
在不会产生混淆的情况下,常常省略运算符
∘
\circ
∘,即将
A
∘
B
\boldsymbol{A}\circ\boldsymbol{B}
A∘B简写成
A
B
\boldsymbol{A}\boldsymbol{B}
AB。
Python的乘法运算符“∗”不能用于矩阵的乘法——因为该运算符已经被用于numpy的array数组的按元素乘法计算了。numpy的matmul函数实现矩阵的乘法运算。
例1 分别就实数域ℝ上的矩阵
(1)
A
=
(
4
−
1
2
1
1
1
0
3
0
3
1
4
)
\boldsymbol{A}=\begin{pmatrix}4&-1&2&1\\1&1&0&3\\0&3&1&4\end{pmatrix}
A=
410−113201134
,
B
=
(
1
2
0
1
3
0
−
1
4
)
\boldsymbol{B}=\begin{pmatrix}1&2\\0&1\\3&0\\-1&4\end{pmatrix}
B=
103−12104
,计算
A
B
\boldsymbol{A}\boldsymbol{B}
AB;
(2)
A
=
(
2
1
4
0
1
−
1
3
4
)
\boldsymbol{A}=\begin{pmatrix}2&1&4&0\\1&-1&3&4\end{pmatrix}
A=(211−14304),
B
=
(
1
3
0
−
1
1
−
3
4
0
)
\boldsymbol{B}=\begin{pmatrix}1&3\\0&-1\\1&-3\\4&0\end{pmatrix}
B=
10143−1−30
,计算
A
B
\boldsymbol{A}\boldsymbol{B}
AB与
B
A
\boldsymbol{B}\boldsymbol{A}
BA;
(3)
A
=
(
−
2
4
1
−
2
)
\boldsymbol{A}=\begin{pmatrix}-2&4\\1&-2\end{pmatrix}
A=(−214−2),
B
=
(
2
4
−
3
6
)
\boldsymbol{B}=\begin{pmatrix}2&4\\-3&6\end{pmatrix}
B=(2−346),计算
A
B
\boldsymbol{A}\boldsymbol{B}
AB与
B
A
\boldsymbol{B}\boldsymbol{A}
BA。
解:见下列代码
import numpy as np #导入numpy
A=np.array([[4,-1,2,1], #设置矩阵A
[1,1,0,3],
[0,3,1,4]])
B=np.array([[1,2], #设置矩阵B
[0,1],
[3,0],
[-1,4]])
print(np.matmul(A,B)) #计算积AB
A=np.array([[2,1,4,0], #设置矩阵A
[1,-1,3,4]])
B=np.array([[1,3], #设置矩阵B
[0,-1],
[1,-3],
[4,0]])
print(np.matmul(A,B)) #计算积AB
print(np.matmul(B,A)) #计算积BA
A=np.array([[-2,4], #设置矩阵A
[1,-2]])
B=np.array([[2,4], #设置矩阵B
[-3,6]])
print(np.matmul(A,B)) #计算积AB
print(np.matmul(B,A)) #计算积BA
程序中第2~9、第10~17和第18~23行分别计算(1)、(2)和(3)。仅以第10~17行的代码加以说明,其他的读者可参照自行研读。第10~11行和第12~15行分别设置矩阵
A
\boldsymbol{A}
A和
B
\boldsymbol{B}
B。第16行调用numpy的矩阵乘法计算函数
matmul(A, B)
\text{matmul(A, B)}
matmul(A, B)
计算矩阵的积
A
B
\boldsymbol{AB}
AB,并输出。第17行调用函数
matmul(B, A)
\text{matmul(B, A)}
matmul(B, A)
计算矩阵的积
B
A
\boldsymbol{BA}
BA。运行程序,输出:
[[ 9 11]
[-2 15]
[-1 19]]
[[ 6 -7]
[20 -5]]
[[ 5 -2 13 12]
[ -1 1 -3 -4]
[ -1 4 -5 -12]
[ 8 4 16 0]]
[[-16 16]
[ 8 -8]]
[[ 0 0]
[ 12 -24]]
由本例可见,矩阵的乘法不满足交换律。
例2 ℝ上矩阵
A
=
(
1
2
3
4
5
6
7
8
9
)
\boldsymbol{A}=\begin{pmatrix}1&2&3\\4&5&6\\7&8&9\end{pmatrix}
A=
147258369
,初等矩阵
E
1
(
1
,
2
)
,
E
2
(
2
(
1
/
2
)
)
,
E
3
(
2
(
1
/
2
)
,
1
)
∈
\boldsymbol{E}_1(1,2),\boldsymbol{E}_2(2(1/2)),\boldsymbol{E}_3(2(1/2),1)\in
E1(1,2),E2(2(1/2)),E3(2(1/2),1)∈ℝ
3
×
3
^{3\times3}
3×3为第一、二、三种初等矩阵(见博文《生成初等矩阵》)。用
E
1
(
1
,
2
)
,
E
2
(
2
(
1
/
2
)
)
,
E
3
(
2
(
1
/
2
)
,
1
)
\boldsymbol{E}_1(1,2),\boldsymbol{E}_2(2(1/2)),\boldsymbol{E}_3(2(1/2),1)
E1(1,2),E2(2(1/2)),E3(2(1/2),1)分别左乘、右乘
A
\boldsymbol{A}
A。
import numpy as np
from fractions import Fraction as F
np.set_printoptions(formatter={'all':lambda x:
str(F(x).limit_denominator())})
A=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
E1=np.eye(3)
P1(E1,0,1)
print(np.matmul(E1,A))
print(np.matmul(A,E1))
E2=np.eye(3)
P2(E2,1,1/2)
print(np.matmul(E2,A))
print(np.matmul(A,E2))
E3=np.eye(3)
P3(E3,1,0,1/2)
print(np.matmul(E3,A))
print(np.matmul(A,E3))
程序的第5~7行设置矩阵A。第8~11行、第12~15行和第16~19行分别用函数P1,P2,P3(见博文《生成初等矩阵》)设置初等矩阵E1,E2,E3。并分别左乘、右乘A。程序的第2~4行设置数组输出格式为有理数。运行程序,输出
[[4 5 6]
[1 2 3]
[7 8 9]]
[[2 1 3]
[5 4 6]
[8 7 9]]
[[1 2 3]
[2 5/2 3]
[7 8 9]]
[[1 1 3]
[4 5/2 6]
[7 4 9]]
[[3 9/2 6]
[4 5 6]
[7 8 9]]
[[1 5/2 3]
[4 7 6]
[7 23/2 9]]
由此可见,用初等矩阵左乘A,相当于对A作相应的行初等变换;右乘A,相当于对A作列初等变换。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。