第4章 深度学习的数学基础
目录
[4.6 矩阵](#4.6 矩阵)
4.6 矩阵
下一章开始,我们就会用到矩阵。借助矩阵,可以用一个式子表示大量的联立方程式,特别方便。此外,使用矩阵或向量表示,也会更有助于我们直观理解方程式。

图4-13 标量、向量、矩阵、张量
4.6.1 什么是矩阵
把数横向或纵向排列,得到的是向量;把数像表格一样既横向排列又纵向排列,得到的就是矩阵。下式表示的是一个2×3矩阵(图4-14):
A = 1 2 3 4 5 6 (4-70) A=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6\\tag{4-70} \\end{array}\\right A=142536(4-70)

图4-14 矩阵
通常,矩阵中横向的内容从上至下读作第1行、第2行等,纵向的内容从左至右读作第1列、第2列等。为了与Python中数组的索引一致,矩阵从0行0列开始计数,即横向从上至下分别是第0行、第1行等,纵向从左至右分别是第0列、第1列等。
式4-70所示的矩阵通常用"2行3列的矩阵"描述。当用一个变量表示矩阵时,一般用粗斜体的大写字母A 表示。矩阵中元素的表示方法是:
A i , j (4-71) A_{i, j}\tag{4-71} Ai,j(4-71)
该式表示的是矩阵A 中第 i i i行第 j j j列的元素,如:
A 0 , 1 = 2 , A 1 , 2 = 6 (4-72) A{0,1}=2,A{1,2}=6\tag{4-72} A0,1=2,A1,2=6(4-72)
请注意,元素的序号是从0开始的。
在用变量表示矩阵中的元素时,由于元素是标量,所以用斜体的小写字母表示:
A = a 0 , 0 a 0 , 1 a 0 , 2 a 1 , 0 a 1 , 1 a 1 , 2 (4-73) \boldsymbol{A}=\left\\begin{array}{lll} a_{0,0} \& a_{0,1} \& a_{0,2} \\\\ a_{1,0} \& a_{1,1} \& a_{1,2}\\tag{4-73} \\end{array}\\right A=a0,0a1,0a0,1a1,1a0,2a1,2(4-73)
a i , j a_{i,j} ai,j的下标 i , j i,j i,j分别是行和列的序号。下标之间的","有时会省略,比如写作 a 01 a_{01} a01。
向量可以算作一种矩阵。比如,如下列向量可以看作一个3行1列的矩阵:
1 2 3 (4-74) \left\\begin{array}{l} 1 \\\\ 2 \\\\ 3\\tag{4-74} \\end{array}\\right 123 (4-74)
而如下行向量可以看作一个1行2列的矩阵:
4 5 (4-75) \begin{bmatrix} 4 & 5 \tag{4-75} \end{bmatrix} 45(4-75)
4.6.2 矩阵的加法和减法
在介绍矩阵和联立方程式的关系之前,我们先介绍几个矩阵相关的规则。首先看一下矩阵的加法运算。下面以2×3矩阵A 和B 为例:
A = 1 2 3 4 5 6 , B = 7 8 9 10 11 12 (4-76) \boldsymbol{A}=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\end{array}\\right, \boldsymbol{B}=\left\\begin{array}{ccc} 7 \& 8 \& 9 \\\\ 10 \& 11 \& 12\\tag{4-76} \\end{array}\\right A=142536,B=710811912(4-76)
矩阵的加法运算是把对应的元素相加(图4-15):
A + B = 1 2 3 4 5 6 + 7 8 9 10 11 12 = 8 10 12 14 16 18 (4-77) \boldsymbol{A}+\boldsymbol{B}=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\end{array}\\right+\left\\begin{array}{ccc} 7 \& 8 \& 9 \\\\ 10 \& 11 \& 12 \\end{array}\\right=\left\\begin{array}{ccc} 8 \& 10 \& 12 \\\\ 14 \& 16 \& 18 \\tag{4-77} \\end{array}\\right A+B=142536+710811912=81410161218(4-77)

图4-15 矩阵的加法和减法
减法运算与加法运算一样,是把对应的元素相减:
A − B = 1 2 3 4 5 6 − 7 8 9 10 11 12 = 1 − 7 2 − 8 3 − 9 4 − 10 5 − 11 6 − 12 = − 6 − 6 − 6 − 6 − 6 − 6 (4-78) \boldsymbol{A}-\boldsymbol{B}=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\end{array}\\right-\left\\begin{array}{ccc} 7 \& 8 \& 9 \\\\ 10 \& 11 \& 12 \\end{array}\\right=\left\\begin{array}{ccc} 1-7 \& 2-8 \& 3-9 \\\\ 4-10 \& 5-11 \& 6-12 \\end{array}\\right=\left\\begin{array}{ccc} -6 \& -6 \& -6 \\\\ -6 \& -6 \& -6 \\tag{4-78} \\end{array}\\right A−B=142536−710811912=1−74−102−85−113−96−12=−6−6−6−6−6−6(4-78)
无论是加法运算还是减法运算,两个矩阵的大小(行数和列数)必须相等。要想利用Python进行矩阵计算,必须和进行向量运算时一样,先使用import导入NumPy库。
python
# 代码清单 4-3-(1)
import numpy as np
然后,使用np.array定义矩阵。
python
# 代码清单 4-3-(2)
A=np.array([[1, 2, 3], [4, 5, 6]])
print(A)
输出结果:
python
[[1 2 3]
[4 5 6]]
在定义向量时,我们只是像np.array(1,2,3)这样用了一组\[\];而在定义矩阵时,则是先把每行的元素用一组\[\]括住,然后用\[\]把整个内容括起来,使用的是双层结构。下面定义矩阵B。
python
# 代码清单 4-3-(3)
B = np.array([[7, 8, 9], [10, 11, 12]])
print(B)
输出结果:
python
[[ 7 8 9]
[10 11 12]]
计算A+B、A-B:
python
# 代码清单 4-3-(4)
print(A + B)
print(A - B)
输出结果:
python
[[ 8 10 12]
[14 16 18]]
[[-6 -6 -6]
[-6 -6 -6]]
4.6.3 标量积
当矩阵乘以标量值时,结果是所有的元素都乘以标量值:
2 A = 2 × 1 2 3 4 5 6 = 2 × 1 2 × 2 2 × 3 2 × 4 2 × 5 2 × 6 = 2 4 6 8 10 12 (4-79) 2 A=2 \times\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\end{array}\\right=\left\\begin{array}{lll} 2 \\times 1 \& 2 \\times 2 \& 2 \\times 3 \\\\ 2 \\times 4 \& 2 \\times 5 \& 2 \\times 6 \\end{array}\\right=\left\\begin{array}{ccc} 2 \& 4 \& 6 \\\\ 8 \& 10 \& 12 \\tag{4-79} \\end{array}\\right 2A=2×142536=2×12×42×22×52×32×6=28410612(4-79)

图4-16 矩阵的标量积
在Python中,矩阵的标量积代码如下:
python
# 代码清单 4-3-(5)
A = np.array([[1, 2, 3], [4, 5, 6]])
print(2 * A)
输出结果:
python
[[ 2 4 6]
[ 8 10 12]]
4.6.4 矩阵的乘积
矩阵之间的乘积(矩阵积)与加法或减法运算不同。
首先看一看1行三列的矩阵A 和3行一列的矩阵B,这两个矩阵可以分别看作行向量和列向量,不过这里当作矩阵进行计算:
A = 1 2 3 , B = 4 5 6 (4-80) A=\left\\begin{array}{lll} 1 \& 2 \& 3 \\end{array}\\right, \boldsymbol{B}=\left\\begin{array}{l} 4 \\\\ 5 \\\\ 6 \\tag{4-80} \\end{array}\\right A=123,B= 456 (4-80)

图4-17 1 × M 1\times M 1×M矩阵和 M × 1 M\times 1 M×1矩阵的乘积
这两个矩阵的乘积可以计算为:
A B = 1 2 3 4 5 6 = 1 × 4 + 2 × 5 + 3 × 6 = 32 (4-81) A B=\left\\begin{array}{lll} 1 \& 2 \& 3 \\end{array}\\right\left\\begin{array}{l} 4 \\\\ 5 \\\\ 6 \\tag{4-81} \\end{array}\\right=1 \times 4+2 \times 5+3 \times 6=32 AB=123 456 =1×4+2×5+3×6=32(4-81)
这就是把A 和B 当作向量时得到的内积。在Python中,A 和B的内积如代码如下:
python
# 代码清单 4-3-(6)
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
print(A.dot(B))
#输出结果:32
计算A 和B 的内积用A.dot(B),A.dot(B)不仅可以计算向量内积,还可以计算矩阵积。但是这样的话,会产生一种对行向量A 和B计算矩阵积的错觉。
其实,在Python中计算矩阵积时,矩阵的行和列会被自动调整为可以进行计算的形式。此时,B会被看作列向量,这样就可以继续计算内积了。
注意:如果使用通常的乘法运算符号"*",则乘法运算会在对应的元素之间进行,如下代码所示:
python
# 代码清单 4-3-(7)
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
print(A * B)
#输出结果:[ 4 10 18]
这跟"+"或"-"相同。"/"也一样,是在对应的元素之间进行除法运算。演示代码如下:
python
# 代码清单 4-3-(8)
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
print(A / B)
#输出结果:[0.25 0.4 0.5 ]
接下来,思考一下A 为 2 × 3 2\times 3 2×3矩阵、B 为 3 × 2 3\times 2 3×2矩阵时的情况:
A = 1 2 3 − 1 − 2 − 3 , B = 4 − 4 5 − 5 6 − 6 \boldsymbol{A}=\left\\begin{array}{ccc} 1 \& 2 \& 3 \\\\ -1 \& -2 \& -3 \\end{array}\\right, \quad \boldsymbol{B}=\left\\begin{array}{cc} 4 \& -4 \\\\ 5 \& -5 \\\\ 6 \& -6 \\end{array}\\right A=1−12−23−3,B= 456−4−5−6
此时,我们把A 看作2行的行向量,把B看作2列的列向量,并以各自的组合计算内积,然后在对应的位置写上答案。

图4-18 L × M L\times M L×M矩阵和 M × N M\times N M×N矩阵的乘积
具体的计算步骤如下:
A B = 1 2 3 − 1 − 2 − 3 4 − 4 5 − 5 6 − 6 = 1 × 4 + 2 × 5 + 3 × 6 1 × ( − 4 ) + 2 × ( − 5 ) + 3 × ( − 6 ) ( − 1 ) × 4 + ( − 2 ) × 5 + ( − 3 ) × 6 ( − 1 ) × ( − 4 ) + ( − 2 ) × ( − 5 ) + ( − 3 ) × ( − 6 ) = 32 − 32 − 32 32 \begin{aligned} A B &=\left\\begin{array}{ccc} 1 \& 2 \& 3 \\\\ -1 \& -2 \& -3 \\end{array}\\right\left\\begin{array}{cc} 4 \& -4 \\\\ 5 \& -5 \\\\ 6 \& -6 \\end{array}\\right \\ &=\left\\begin{array}{cc} 1 \\times 4+2 \\times 5+3 \\times 6 \& 1 \\times(-4)+2 \\times(-5)+3 \\times(-6) \\\\ (-1) \\times 4+(-2) \\times 5+(-3) \\times 6 \& \\quad(-1) \\times(-4)+(-2) \\times(-5)+(-3) \\times(-6) \\end{array}\\right \\ &=\left\\begin{array}{cc} 32 \& -32 \\\\ -32 \& 32 \\end{array}\\right \end{aligned} AB=1−12−23−3 456−4−5−6 =1×4+2×5+3×6(−1)×4+(−2)×5+(−3)×61×(−4)+2×(−5)+3×(−6)(−1)×(−4)+(−2)×(−5)+(−3)×(−6)=32−32−3232
( 4 − 82 ) (4-82) (4−82)
与前面一样,同样使用A.dot(B)计算。
python
# 代码清单 4-3-(9)
A = np.array([[1, 2, 3], [-1, -2, -3]])
B = np.array([[4, -4], [5, -5], [6, -6]])
print(A.dot(B))
输出结果:
python
[[ 32 -32]
[-32 32]]
在一般情况下,当A 为 L × M L\times M L×M矩阵、B 为 M × N M\times N M×N矩阵时,AB 的大小为 L × N L\times N L×N。当A 的列数与B的行数不等时,不能计算矩阵积。
矩阵积的元素 i 、 j i、j i、j计算为:
A B i , j = ∑ m = 0 M − 1 a i , m b m , j (4-83) \\boldsymbol{A} \\boldsymbol{B}{i, j}=\sum{m=0}^{M-1} a_{i, m} b_{m, j} \tag{4-83} ABi,j=m=0∑M−1ai,mbm,j(4-83)
行数和列数相等的矩阵叫作方阵。当A 和B 均为方阵时,虽然我们可以计算出AB 和BA 的值,但是在一般情况下AB =BA是不成立的,所以在矩阵的乘法运算中,顺序很重要。从这一点来说,矩阵积与即使改变顺序答案也不变的标量积不同。
4.6.5 单位矩阵
对角元素均为1、其他元素均为0的特殊方阵叫作单位矩阵,用I 表示,如 3 × 3 3\times3 3×3的单位矩阵为:
I = 1 0 0 0 1 0 0 0 1 (4-84) \boldsymbol{I}=\left\\begin{array}{lll} 1 \& 0 \& 0 \\\\ 0 \& 1 \& 0 \\\\ 0 \& 0 \& 1 \\tag{4-84} \\end{array}\\right I= 100010001 (4-84)

图4-19 单位矩阵
在Python中,np.identity(n)用于生成 n × n n\times n n×n的单位矩阵),示例如下:
python
# 代码清单 4-3-(10)
print(np.identity(3))
输出结果:
python
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
python
print(np.eye(3))
输出结果:
python
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
各个元素之后有" ⋅ \cdot ⋅",这表示矩阵的元素可以是用于表示小数的float类型。
单位矩阵与标量"1"类似。任何数乘以1,结果都还是该数。单位矩阵也一样,任何矩阵(大小相同的方阵)与单位矩阵相乘,结果都不发生变化。比如,3×3矩阵与单位矩阵相乘:
1 2 3 4 5 6 7 8 9 1 0 0 0 1 0 0 0 1 = 1 + 0 + 0 0 + 2 + 0 0 + 0 + 3 4 + 0 + 0 0 + 5 + 0 0 + 0 + 6 7 + 0 + 0 0 + 8 + 0 0 + 0 + 9 = 1 2 3 4 5 6 7 8 9 \left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\\\ 7 \& 8 \& 9 \\end{array}\\right\left\\begin{array}{lll} 1 \& 0 \& 0 \\\\ 0 \& 1 \& 0 \\\\ 0 \& 0 \& 1 \\end{array}\\right=\left\\begin{array}{lll} 1+0+0 \& 0+2+0 \& 0+0+3 \\\\ 4+0+0 \& 0+5+0 \& 0+0+6 \\\\ 7+0+0 \& 0+8+0 \& 0+0+9 \\end{array}\\right=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6 \\\\ 7 \& 8 \& 9 \\end{array}\\right 147258369 100010001 = 1+0+04+0+07+0+00+2+00+5+00+8+00+0+30+0+60+0+9 = 147258369
(4-85) \tag{4-85} (4-85)
计算代码如下:
python
# 代码清单 4-3-(11)
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
I = np.identity(3)
print(A.dot(I))
输出结果:
python
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
这里介绍单位矩阵,其实是为了给接下来要介绍的逆矩阵做铺垫。
4.6.6 逆矩阵
如何对矩阵进行除法运算呢?对于标量,除以3的运算与乘以3的倒数 1 3 \frac{1}{3} 31是一样的。一个数的倒数是与其相乘可以得到1的数。 a a a的倒数为 1 a \frac{1}{a} a1,也可以表示为 a − 1 a^{-1} a−1:
a × a − 1 = 1 (4-86) a \times a^{-1}=1\tag{4-86} a×a−1=1(4-86)
与之类似,矩阵也有与其对应的逆矩阵。

图4-20 逆矩阵
但是,只有行数和列数相等的方阵才具有逆矩阵。一个方阵A 与其逆矩阵 A − 1 \boldsymbol A^{-1} A−1相乘的结果为单位矩阵I:
A A − 1 = A − 1 A = I (4-87) \boldsymbol A \boldsymbol A^{-1}=\boldsymbol A^{-1} \boldsymbol A=\boldsymbol I\tag{4-87} AA−1=A−1A=I(4-87)
在一般情况下,矩阵积的结果与顺序有关,但一个矩阵与其逆矩阵的积一定是单位矩阵,所以与顺序无关。
比如,当A为2×2方阵时,令 A = a b c d \boldsymbol A=\left\\begin{array}{ll} a \& b \\\\ c \& d \\end{array}\\right A=acbd,则A的逆矩阵为:
A − 1 = 1 a d − b c d − b − c a (4-88) \boldsymbol A^{-1}=\frac{1}{a d-b c}\left\\begin{array}{cc} d \& -b \\\\ -c \& a \\tag{4-88} \\end{array}\\right A−1=ad−bc1d−c−ba(4-88)
如果 A = 1 2 3 4 \boldsymbol A=\left\\begin{array}{ll} 1 \& 2 \\\\ 3 \& 4 \\end{array}\\right A=1324,那么A的逆矩阵为:
A − 1 = 1 1 ⋅ 4 − 2 ⋅ 3 4 − 2 − 3 1 = − 1 2 4 − 2 − 3 1 = − 2 1 1.5 − 0.5 (4-89) \boldsymbol A^{-1}=\frac{1}{1 \cdot 4-2 \cdot 3}\left\\begin{array}{cc} 4 \& -2 \\\\ -3 \& 1 \\end{array}\\right=-\frac{1}{2}\left\\begin{array}{cc} 4 \& -2 \\\\ -3 \& 1 \\end{array}\\right=\left\\begin{array}{cc} -2 \& 1 \\\\ 1.5 \& -0.5 \\tag{4-89} \\end{array}\\right A−1=1⋅4−2⋅314−3−21=−214−3−21=−21.51−0.5(4-89)
试着计算 A A − 1 \boldsymbol{AA}^{-1} AA−1,可得到单位矩阵:
A A − 1 = 1 2 3 4 ⋅ − 1 2 4 − 2 − 3 1 = − 1 2 − 2 0 0 − 2 = 1 0 0 1 (4-90) \boldsymbol{A} \boldsymbol{A}^{-1}=\left\\begin{array}{ll} 1 \& 2 \\\\ 3 \& 4 \\end{array}\\right \cdot-\frac{1}{2}\left\\begin{array}{cc} 4 \& -2 \\\\ -3 \& 1 \\end{array}\\right=-\frac{1}{2}\left\\begin{array}{cc} -2 \& 0 \\\\ 0 \& -2 \\end{array}\\right=\left\\begin{array}{ll} 1 \& 0 \\\\ 0 \& 1 \\tag{4-90} \\end{array}\\right AA−1=1324⋅−214−3−21=−21−200−2=1001(4-90)
在Python中,np.linalg.inv(A)用于求A的逆矩阵:
python
# 代码清单 4-3-(12)
A = np.array([[1, 2], [3, 4]])
invA = np.linalg.inv(A)
print(invA)
输出结果:
python
[[-2. 1. ]
[ 1.5 -0.5]]
如上所示,得到的结果与上面的式4-89的结果一样。
这里必须注意,也有一些方阵没有对应的逆矩阵。如果是2×2方阵,那么使得 a d − b c = 0 ad-bc=0 ad−bc=0的矩阵就不存在逆矩阵。因为这样的话,式4-88中分数的分母就是0。
比如矩阵 2 − 2 − 1 1 \left\\begin{array}{cc} 2 \& -2 \\\\ -1 \& 1 \\end{array}\\right 2−1−21,由于 a d − b c = 0 ad-bc=0 ad−bc=0,所以它没有逆矩阵。
对于3×3和4×4等较大的矩阵,虽然也可以使用公式求逆矩阵,但是计算过程很复杂。因此,在机器学习中一般会借用库的力量,使用np.linalg.inv(A)求逆矩阵。
4.6.7 转置
将列向量转换为行向量、将行向量转换为列向量的转置运算,已在4.1节介绍。这个转置运算也可以扩展到矩阵中。
以下式为例说明一下:
A = 1 2 3 4 5 6 (4-91) \boldsymbol{A}=\left\\begin{array}{lll} 1 \& 2 \& 3 \\\\ 4 \& 5 \& 6\\tag{4-91} \\end{array}\\right A=142536(4-91)
把矩阵A 的行和列互换,即可得到A 的转置 A T \boldsymbol A^T AT,结果为(图4-23):
A T = 1 4 2 5 3 6 (4-92) \boldsymbol{A}^{\mathrm{T}}=\left\\begin{array}{ll} 1 \& 4 \\\\ 2 \& 5 \\\\ 3 \& 6\\tag{4-92} \\end{array}\\right AT= 123456 (4-92)
Python实现代码如下:
python
# 代码清单 4-3-(13)
A = np.array([[1, 2, 3], [4, 5, 6]])
print(A)
print(A.T)
扩展到一般情况,转置之后,矩阵下标的顺序会被替换:
A i j = A T j i (4-93) \\boldsymbol{A}{i j}=\left\\boldsymbol{A}\^{\\mathrm{T}}\\right{j i}\tag{4-93} Aij=ATji(4-93)
在对AB整体进行转置时,如下关系式成立:
( A B ) T = B T A T (4-94) (\boldsymbol{A} \boldsymbol{B})^{\mathrm{T}}=\boldsymbol{B}^{\mathrm{T}} \boldsymbol{A}^{\mathrm{T}}\tag{4-94} (AB)T=BTAT(4-94)
转置之后矩阵积的顺序与转置前相反。以2×2矩阵为例,如下所示,可以证明式4-94成立:
( A B ) T = \[ a 11 a 12 a 21 a 22 b 11 b 12 b 21 b 22 ] T = a 11 b 11 + a 12 b 21 a 21 b 11 + a 22 b 21 a 11 b 12 + a 12 b 22 a 21 b 12 + a 22 b 22 B T A T = b 11 b 21 b 12 b 22 a 11 a 21 a 12 a 22 = a 11 b 11 + a 12 b 21 a 21 b 11 + a 22 b 21 a 11 b 12 + a 12 b 22 a 21 b 12 + a 22 b 22 \begin{array}{l} (\boldsymbol{A B})^{\mathrm{T}}=\left\\left\[\\begin{array}{ll} a_{11} \& a_{12} \\\\ a_{21} \& a_{22} \\end{array}\\right\left\\begin{array}{ll} b_{11} \& b_{12} \\\\ b_{21} \& b_{22} \\end{array}\\right\right]^{\mathrm{T}}=\left\\begin{array}{ll} a_{11} b_{11}+a_{12} b_{21} \& a_{21} b_{11}+a_{22} b_{21} \\\\ a_{11} b_{12}+a_{12} b_{22} \& a_{21} b_{12}+a_{22} b_{22} \\end{array}\\right \\ \boldsymbol{B}^{\mathrm{T}} \boldsymbol{A}^{\mathrm{T}}=\left\\begin{array}{ll} b_{11} \& b_{21} \\\\ b_{12} \& b_{22} \\end{array}\\right\left\\begin{array}{ll} a_{11} \& a_{21} \\\\ a_{12} \& a_{22} \\end{array}\\right=\left\\begin{array}{ll} a_{11} b_{11}+a_{12} b_{21} \& a_{21} b_{11}+a_{22} b_{21} \\\\ a_{11} b_{12}+a_{12} b_{22} \& a_{21} b_{12}+a_{22} b_{22} \\end{array}\\right \end{array} (AB)T=\[a11a21a12a22b11b21b12b22]T=a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22BTAT=b11b12b21b22a11a12a21a22=a11b11+a12b21a11b12+a12b22a21b11+a22b21a21b12+a22b22
使用式4-94可以简单推导出:
( A B C ) T = C T ( A B ) T = C T B T A T (4-95) (\boldsymbol{A} \boldsymbol{B} \boldsymbol{C})^{\mathrm{T}}=\boldsymbol{C}^{\mathrm{T}}(\boldsymbol{A} \boldsymbol{B})^{\mathrm{T}}=\boldsymbol{C}^{\mathrm{T}} \boldsymbol{B}^{\mathrm{T}} \boldsymbol{A}^{\mathrm{T}}\tag{4-95} (ABC)T=CT(AB)T=CTBTAT(4-95)
这是把看作一个整体,先对与C 进行转置,最后对AB进行转置。哪怕是三个矩阵的矩阵积,转置之后,矩阵下标的顺序也会被替换。
4.6.8 矩阵和联立方程式
借助矩阵,我们可以用一个式子表示大量的联立方程式,特别方便。到此为止的内容都是为使用矩阵做的铺垫,接下来,我们尝试用一个矩阵表示两个联立方程式,并使用矩阵运算求解答案。具体来说,这里以下面的联立方程式为例:
y = 2 x (4-96) y=2x \tag{4-96} y=2x(4-96)
y = − x + 3 (4-97) y=-x+3 \tag{4-97} y=−x+3(4-97)

图4-21 用矩阵表示法求解联立方程式
对于上面的联立方程式,把式4-96代入式4-97之后,可以简单地求出 x = 1 x=1 x=1, y = 2 y=2 y=2。这里特意通过矩阵的方式求解。首先,将式4-96和式4-97变形,得到:
2 x − y = 0 x + y = 3 (4-98) \begin{array}{l} 2 x-y=0\\ x+y=3 \tag{4-98} \end{array} 2x−y=0x+y=3(4-98)
上式可以表示为矩阵:
2 − 1 1 1 x y = 0 3 (4-99) \left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\left\\begin{array}{l} x \\\\ y \\end{array}\\right=\left\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\tag{4-99} 21−11xy=03(4-99)
为什么可以这样表示呢?计算式4-99的左边之后,可知下式成立,即两个列向量相等:
2 x − y x + y = 0 3 (4-100) \left\\begin{array}{l} 2 x-y \\\\ x+y \\end{array}\\right=\left\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\tag{4-100} 2x−yx+y=03(4-100)
式子左边和右边的向量相等,即矩阵中的对应元素相等,所以式4-100与式4-98是一个意思。
接下来,要想求出 x x x和 y y y的值,需要把式4-99变形为:
x y \] = \[ ? ? \] \\left\[\\begin{array}{l} x \\\\ y \\end{array}\\right\]=\\left\[\\begin{array}{l} ? \\\\ ? \\end{array}\\right\] \[xy\]=\[??
因此,首先让式4-99的两边乘以$
\left[\begin{array}{cc}
2 & -1 \
1 & 1
\end{array}\right]
$的逆矩阵:
2 − 1 1 1 − 1 2 − 1 1 1 x y = 2 − 1 1 1 − 1 0 3 (4-101) \left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right^{-1}\left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\left\\begin{array}{l} x \\\\ y \\end{array}\\right=\left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right^{-1}\left\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\tag{4-101} 21−11−121−11xy=21−11−103(4-101)
根据逆矩阵的性质可知,左边是一个单位矩阵:
1 0 0 1 x y = 2 − 1 1 1 − 1 0 3 (4-102) \left\\begin{array}{ll} 1 \& 0 \\\\ 0 \& 1 \\end{array}\\right\left\\begin{array}{l} x \\\\ y \\end{array}\\right=\left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right^{-1}\left\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\tag{4-102} 1001xy=21−11−103(4-102)
已知单位矩阵乘以 x y T x y^{\mathrm{T}} xyT,结果不变,所以我们可以得到:
x y \] = \[ 2 − 1 1 1 \] − 1 \[ 0 3 \] \\left\[\\begin{array}{l} x \\\\ y \\end{array}\\right\]=\\left\[\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\]\^{-1}\\left\[\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\] \[xy\]=\[21−11\]−1\[03
通过公式4-88计算出如下所示的 2 − 1 1 1 − 1 \left\\begin{array}{cc}2 \& -1 \\\\ 1 \& 1\\end{array}\\right^{-1} 21−11−1的结果:
2 − 1 1 1 \] − 1 = 1 2 × 1 − ( − 1 ) × 1 \[ 1 1 − 1 2 \] = 1 3 \[ 1 1 − 1 2 \] \\left\[\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\]\^{-1}=\\frac{1}{2 \\times 1-(-1) \\times 1}\\left\[\\begin{array}{cc} 1 \& 1 \\\\ -1 \& 2 \\end{array}\\right\]=\\frac{1}{3}\\left\[\\begin{array}{cc} 1 \& 1 \\\\ -1 \& 2 \\end{array}\\right\] \[21−11\]−1=2×1−(−1)×11\[1−112\]=31\[1−112
然后得到:
x y = 1 3 1 1 − 1 2 0 3 = 1 3 1 × 0 + 1 × 3 ( − 1 ) × 0 + 2 × 3 = 1 2 (4-103) \left\\begin{array}{l} x \\\\ y \\end{array}\\right=\frac{1}{3}\left\\begin{array}{cc} 1 \& 1 \\\\ -1 \& 2 \\end{array}\\right\left\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right=\frac{1}{3}\left\\begin{array}{l} 1 \\times 0+1 \\times 3 \\\\ (-1) \\times 0+2 \\times 3 \\end{array}\\right=\left\\begin{array}{l} 1 \\\\ 2 \\end{array}\\right\tag{4-103} xy=311−11203=311×0+1×3(−1)×0+2×3=12(4-103)
观察对应的元素可知,我们得到了正确的值,即 x = 1 x=1 x=1, y = 2 y=2 y=2。
对方程式求解时也需要变形,求出" x = ? x=? x=?"。从这一点来说,这种方法与求解方程式的过程是类似的。对于方程式 a x = b ax=b ax=b,我们会在等式的两边都乘以 a a a的倒数,将其变形为 x = b / a x=b/a x=b/a的形式。而矩阵是让等式两边都从左边乘以逆矩阵,将\\boldsymbol{A}x= \\boldsymbol B 变形 变形 变形x=\\boldsymbol{A}\^{-1}\\boldsymbol{B}的形式。
对于只有两个变量的两个联立方程式,即使用普通方法求解也不算麻烦,但是当变量和式子增多时,比如有 D D D个式子,这种使用矩阵的方法就会起到不凡的作用。
4.6.9 矩阵和映射
我们可以通过图形解释向量的加法或减法,同样地,也可以通过图形解释矩阵运算。矩阵可以看作"把向量转换为另一个向量的规则"。此外,如果将向量解释为坐标,即空间内的某个点,那么矩阵就可以解释为"令某点向别的点移动的规则"。
像这样关于从组(向量或点)到组(向量或点)的对应关系的规则叫作映射 ,矩阵的映射是一种线性映射。
比如,看一下上一节4-99矩阵方程式的左边,即式:
2 − 1 1 1 \] \[ x y \] \\left\[\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\]\\left\[\\begin{array}{l} x \\\\ y \\end{array}\\right\] \[21−11\]\[xy
将上式展开之后,可得到下式:
2 − 1 1 1 x y = 2 x − y x + y (4-104) \left\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\left\\begin{array}{l} x \\\\ y \\end{array}\\right=\left\\begin{array}{l} 2 x-y \\\\ x+y \\end{array}\\right\tag{4-104} 21−11xy=2x−yx+y(4-104)
因此矩阵 2 − 1 1 1 \left\\begin{array}{cc}2 \& -1 \\\\ 1 \& 1\\end{array}\\right 21−11可以解释为一个令点 x y \left\\begin{array}{cc}x \\\\ y\\end{array}\\right xy向点 2 x − y x + y \left\\begin{array}{cc}2x-y \\\\ x+y\\end{array}\\right 2x−yx+y向点移动的映射。
比如,把向量 1 , 0 T 1,0^T 1,0T代入式4-104之后,可得到 2 , 1 T 2,1^T 2,1T,所以可以说点 1 , 0 T 1,0^T 1,0T通过这个矩阵移动到点 2 , 1 T 2,1^T 2,1T 。同样,也可以说点 0 , 1 T 0,1^T 0,1T通过这个矩阵移动到 − 1 , − 1 T -1,-1^T −1,−1T,点 1 , 2 T 1,2^T 1,2T通过这个矩阵移动到 0 , 3 T 0,3^T 0,3T。像这样从各种点移动的情形如图4-22中的左图所示,形状为由内向外的旋涡状。
图4-22中的右图为 2 − 1 1 1 \left\\begin{array}{cc}2 \& -1 \\\\ 1 \& 1\\end{array}\\right 21−11的逆矩阵的映射,它是由外向内的旋涡状,与原矩阵的映射的移动方向刚好相反。

图4-22 矩阵形式的向量的映射
这里,式4-99可以解释为这样一个问题:应用矩阵 2 − 1 1 1 \left\\begin{array}{cc}2 \& -1 \\\\ 1 \& 1\\end{array}\\right 21−11的映射规则被移动到 0 3 \left\\begin{array}{cc}0 \\\\ 3\\end{array}\\right 03的是哪个点?
2 − 1 1 1 \] \[ x y \] = \[ 0 3 \] \\left\[\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\]\\left\[\\begin{array}{l} x \\\\ y \\end{array}\\right\]=\\left\[\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\] \[21−11\]\[xy\]=\[03
答案为:
x y \] = \[ 2 − 1 1 1 \] − 1 \[ 0 3 \] = \[ 1 2 \] \\left\[\\begin{array}{l} x \\\\ y \\end{array}\\right\]=\\left\[\\begin{array}{cc} 2 \& -1 \\\\ 1 \& 1 \\end{array}\\right\]\^{-1}\\left\[\\begin{array}{l} 0 \\\\ 3 \\end{array}\\right\]=\\left\[\\begin{array}{l} 1 \\\\ 2 \\end{array}\\right\] \[xy\]=\[21−11\]−1\[03\]=\[12
我们可以这样理解:通过逆矩阵把移动后的点 0 3 \left\\begin{array}{cc}0 \\\\ 3\\end{array}\\right 03恢复到动前的位置可知,移动前的位置是点 1 2 \left\\begin{array}{cc}1 \\\\ 2\\end{array}\\right 12。