本章由wzy翻译,感谢wzy对本章的用心翻译。

翻译人:wzy
翻译人联系方式:838168242@qq.com
代为发布人与审核人:StubbornHuang

5 线性代数

某种意义上说,在图形程序中应用的最普遍的工具就是矩阵了,通过矩阵可以对点和向量进行变换和转换。在下一章,我们将看到,如何用单列矩阵表示一个向量,如何通过与方阵相乘,在不同的基础上表示向量。我们也会展示如何运用这种乘法来完成一些向量的变换,比如:缩放,旋转和平移。在这一章,我们会回顾一下与几何透视相关的基础线性代数知识,并着重于那些在二维和三维情况下工作良好的算法。
对于那些线性代数不错的读者,可以跳过此章。然而,即使是这样的读者,本章也有一些具有启发性的有趣东西,比如,行列式的发展史,对于奇异值的讨论,特征值分解等等。

5.1 行列式

​ 我们常常认为行列式产生于对线性方程的求解问题。但是,为了我们的目标,我们将其视为向量的相乘。对于二维向量ab,行列式|ab|是由ab两个向量构成的平行四边形(图片 5.1)。这是一个有向面积,当ab符合右手螺旋定则时,符号为正,反之为负。这意味着|ab|=-|ba|。在二维空间中,我们可以将“右手螺旋定则”理解为我们逆时针旋转第一个向量,以接近第二个向量的最小角度。在三维空间内,每个行列式必须由三个向量组成。对于三个三维向量a,b,c,行列式|abc|是由这3个向量构成的平行六面体,这是一个有向空间。为了计算一个二维空间的行列式,我们首先要展示一些它的性质。我们注意到,缩放平行四边形的一侧会按相同的比例缩放其面积(图片 5.3):

|(k a)b|=|a(k b)|=k|ab|.

我们也注意到“剪切”平行四边形不会改变其面积(Figure 5.4):

|(a+k b)b|=|a(b+k a)|=|ab|.

最后,我们知道行列式拥有如下性质:

|a(b+c)|=|ab|+|ac|,

因为如图5.5所示,我们可以“滑动”两个平行四边形之间的边缘,形成一个单独的平行四边形,而不改变两个原始平行四边形的面积。
现在,我们为ab假设出他们的笛卡尔表示:

|ab|=|(x_aX+y_aY)(x_bX+y_bY)|\\
=x_ax_b|XX|+x_ay_b|XY|+y_ax_b|YX|+y_ay_b|YY|\\
=x_ax_b(0)+x_ay_b(+1)+y_ax_b(-1)+y_ay_b(0)\\
=x_ay_b-y_ax_b

这个简化过程,运用了一个定理,对于任何向量v,都有|vv|=0,因为由v和v所构成的平行四边形与v永远共线,因此没有面积。
在三维中,三个三维向量abc的行列式表示为|abc|。对于向量的笛卡尔表示,平行六面体和平行四边形都有类似的规则,我们可以像二维一样进行类似的展开:

|abc|=|(x_aX+y_aY+z_aZ)(x_bX+y_bY+z_bZ)(x_cX+y_cY+z_cZ)|\\
=x_ay_bz_c-x_az_by_c-y_ax_bz_c+y_az_bx_c+z_ax_by_c-z_ay_bx_c.

如您所见,随着维数的增加,以这种方式计算行列式会变得更加糟糕。我们将在第5.3节中讨论计算行列式时不易出错的方法。

Example.

将一个向量表达为其他两个向量的线性组合时,行列式就自然而然的产生了,例如,我们打算将向量c表示为向量a和向量b的组合:

c = a_ca + b_cb.

我们能从图片5.6看出:

|(b_cb)a| = |ca|,

因为这些平行四边形只是彼此的剪切版本。b_c的解就出来了:

b_c=\frac{|ca|}{|ba|}.

类似的:

a_c=\frac{|bc|}{|ba|}.

这是克拉姆法则的二维版本,我们将在第5.3.2节中重新讨论。

5.2 矩阵

矩阵是遵循某些算术规则的数值元素数组。具有两行三列的矩阵示例如下:

\left[
\begin{matrix}
1.7& -1.2 & 4.2 \\
3.0 & 4.5&-7.2

\end{matrix}
\right]

矩阵在计算机图形学中有多种用处,其中就包括表示空间变换。在我们的讨论中,我们假设矩阵的元素都是实数。本章会介绍矩阵运算的原理和“方型”矩阵所对应的行列式(行数和列数相同的矩阵)。

5.2.1 矩阵的运算

一个矩阵乘以一个常数,所得的矩阵,其中每个元素都被该常数乘以,

2\left[
\begin{matrix}
1& -4 \\
3& 2
\end{matrix}
\right]=\left[
\begin{matrix}
2& -8 \\
6& 4
\end{matrix}
\right]

两个矩阵相加,对应元素相加

\left[
\begin{matrix}
1& -4 \\
3& 2
\end{matrix}
\right]+\left[
\begin{matrix}
2& 2 \\
2& 2
\end{matrix}
\right]=\left[
\begin{matrix}
3& -2 \\
5& 4
\end{matrix}
\right]

对于矩阵乘法,规则是将第一个矩阵的行与第二个矩阵的列“相乘”:

\left[
\begin{matrix}
a_{11}&\cdots& a_{1m}\\
\vdots&\ &\vdots\\
a_{i1}&\cdots&a_{im}\\
\vdots&\ &\vdots\\
a_{r1}&\cdots& a_{rm}\\
\end{matrix}
\right]\left[
\begin{matrix}
b_{11}&\cdots& b_{1j}&\cdots&b_{1c}\\
\vdots&\ &\vdots&\ &\vdots\\
b_{m1}&\cdots& b_{mj}&\cdots&b_{mc}\\
\end{matrix}
\right]=\left[
\begin{matrix}
p_{11}&\cdots& p_{1j}&\cdots&p_{1c}\\
\vdots&\ &\vdots&\ &\vdots\\
p_{i1}&\cdots& p_{ij}&\cdots&p_{ic}\\
\vdots&\ &\vdots&\ &\vdots\\
p_{r1}&\cdots& p_{rj}&\cdots&p_{rc}\\
\end{matrix}
\right]

所以,元素p_{ij}的计算过程如下:

p_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots+a_{im}b_{mj}

只有当左矩阵的列数与右矩阵的行数相同时,才可能得到两个矩阵的乘积。例如:

\left[
\begin{matrix}
0&1 \\
2&3 \\
4&5
\end{matrix}
\right]\left[
\begin{matrix}
6& 7&8&9 \\
0& 1&2&3
\end{matrix}
\right]=\left[
\begin{matrix}
0& 1&2&3 \\
12&17&22&27\\
24&33&42&51
\end{matrix}
\right]

在大多数情况下,矩阵乘法是不可交换的:

AB\neq BA

此外,如果AB=AC,也不一定有B=C。但幸运的是,矩阵乘法是满足结合律和分配律的:

(AB)C=A(BC)\\
A(B+C)=AB+AC\\
(A+B)C=AC+BC

5.2.2 矩阵的运算

我们需要一个与实数的倒数相类似的矩阵。我们知道实数x的倒数是1/xx与其倒数的乘积是1。我们现在需要一个矩阵I,我们可以认为是“矩阵1”。这种情况只存在于方型矩阵中,它被称为单位矩阵;它由对角线上的1和其他地方的0组成。例如,4\times4的单位矩阵是:

I=\left[
\begin{matrix}
1& 0&0&0 \\
0& 1&0&0\\
0&0&1&0\\
0&0&0&1
\end{matrix}
\right]

矩阵A的逆矩阵A^{-1},保证了AA^{-1}=I

例如:

\left[
\begin{matrix}
1& 2 \\
3& 4
\end{matrix}
\right]^{-1}=\left[
\begin{matrix}
-2.0& 1.0 \\
1.5& -0.5
\end{matrix}
\right] because \left[
\begin{matrix}
1& 2 \\
3& 4
\end{matrix}
\right]\left[
\begin{matrix}
-2.0& 1.0 \\
1.5& -0.5
\end{matrix}
\right]=\left[
\begin{matrix}
1& 0 \\
0& 1
\end{matrix}
\right]

注意,A^{-1}的逆矩阵是A。所以AA^{-1}=A^{-1}A=I。两个矩阵乘积的逆是两个矩阵逆的乘积,但顺序相反:

(AB)^{-1}=B^{-1}A^{-1}\tag{5.4}

我们将在本章的后面回到计算逆的问题上。

矩阵A的转置A^T与矩阵A具有相同的元素,但行与列被交换了。如果将A^T的元素记为a_{ij}',那么

a_{ij}=a_{ij}'

例如:

\left[
\begin{matrix}
1& 2 \\
3& 4\\
5&6
\end{matrix}
\right]^T=\left[
\begin{matrix}
1& 3&5 \\
2& 4&6
\end{matrix}
\right]
```latex

两个矩阵乘积的转置遵循的规则同等式(5.4)类似:

```latex
(AB)^T=B^TA^T

方阵对应的行列式可以简化为由几个列矩阵所组成,可以看作是一个向量集。在刚才讨论的矩阵运算中有几个和行列式相关的性质很美妙,我们在这里列出这些关系以供参考:

|AB|=|A||B|\\
|A^{-1}|=\frac{1}{|A|}\\
|A^T|=|A|

5.2.3 矩阵形式的向量运算

在图形学中,我们使用一个方阵来对向量进行变换,其过程也是以矩阵的形式呈现。例如,假设存在一个二维向量a=(x_a,y_a),要将其围绕原点旋转90度以获得向量a'=(−y_a,x_a),你可以用一个2\times2的矩阵乘以一个2\times1的矩阵(列向量)。以矩阵形式进行的计算如下:

\left[
\begin{matrix}
0& -1 \\
1& 0
\end{matrix}
\right]\left[
\begin{matrix}
x_a \\
y_a
\end{matrix}
\right]=\left[
\begin{matrix}
-y_a \\
x_a
\end{matrix}
\right]

通过使用该矩阵的转置,并将行向量乘在左侧(“预乘”),我们可以得到相同的结果:

\left[\begin{array}{lll}
x_{a} & y_{a} & z_{a}
\end{array}\right]\left[\begin{array}{c}
x_{b} \\
y_{b} \\
z_{b}
\end{array}\right]=\left[x_{a} x_{b}+y_{a} y_{b}+z_{a} z_{b}\right]

如今,使用列向量进行后乘法是相当标准的,但在许多较旧的书籍和教学系统中,您会遇到行向量和预乘法。唯一的区别是变换矩阵必须替换为其转置。
我们还可以使用矩阵形式来对向量上的计算进行编码。如果我们把点积的结果看作1\times1矩阵,它可以被写出来:

a\cdot b=a^Tb

例如,如果让两个三维向量相乘:

\left[
\begin{matrix}
x_a&y_a&z_a
\end{matrix}
\right]\left[
\begin{matrix}
x_b\\
y_b\\
z_b
\end{matrix}
\right]=\left[
\begin{matrix}
x_ax_b+y_ay_b+z_az_b
\end{matrix}
\right]

相关向量积是两个向量之间的外积,可表示为矩阵乘法,左侧为列向量,右侧为行向量:ab^T,结果是由ab向量中所有元素配对乘积所组成的矩阵。对于三维向量,如下:

\left[
\begin{matrix}
x_a\\y_a\\z_a
\end{matrix}
\right]\left[
\begin{matrix}
x_b&y_b&z_b
\end{matrix}
\right]=\left[
\begin{matrix}
x_ax_b&x_ay_b&x_az_b\\
y_ax_b&y_ay_b&y_az_b\\
z_ax_b&z_ay_b&z_az_b
\end{matrix}
\right]

​ 将矩阵乘法视为向量运算常常会很有用。为了说明三维的情况,我们可以有两种方式将3\times3的矩阵视为三个三维向量的集合:或者由三个并排的列向量组成,或者由三个堆叠的行向量组成。例如,矩阵向量乘法y=Ax的结果可以理解为一个向量,其中的元素就是xA的行的点积。为这些行向量起名为r_i,我们有:

\left[
\begin{matrix}
|\\y\\|
\end{matrix}
\right]=\left[
\begin{matrix}
-&r_1&-\\
-&r_2&-\\
-&r_3&-
\end{matrix}
\right]\left[
\begin{matrix}
|\\X\\|
\end{matrix}
\right]\\
y_i=r_i\cdot X

或者,我们可以将其视为矩阵A中的三个列向量c_ix的元素进行加权后,再求和:

\left[
\begin{matrix}
|\\y\\|
\end{matrix}
\right]=\left[
\begin{matrix}
|&|&|\\
c_1&c_2&c_3\\
|&|&|
\end{matrix}
\right]\left[
\begin{matrix}
x_1\\x_2\\x_3
\end{matrix}
\right]\\
y=x_1c_1+x_2c_2+x_3c_3

​ 使用相同的思想,我们可以将矩阵与矩阵的积AB理解为包含A的所有行与B的所有列的成对点积的数组(参见(5.2));作为矩阵AB的所有列向量的乘积的集合,从左到右排列;作为A的所有行向量与矩阵B的乘积的集合,从上到下堆叠;或者作为A的所有列与B的所有行的成对外积之和(参见练习8)
​ 矩阵乘法的这些理解方式对于理解几何运算的几何意义通常很有帮助,否则这些运算看起来可能非常抽象。

5.2.4 特殊类型的矩阵

单位矩阵是对角线矩阵的一个例子,其中所有非零元素都出现在对角线上。如果从左上角开始计数的话,对角线上元素的行索引和列索引数值是相等的。
单位矩阵还有一个性质,即它本身与它的转置相同。这种矩阵称为对称矩阵。
单位矩阵也是一个正交矩阵,因为它的每一列可以被视为一个向量,其长度为1,并且这些列向量彼此正交。对于行来说也是如此(请参见练习2)。任何正交矩阵所对应的行列式都为+1或者−1。
正交矩阵的一个非常有用的性质是,它们差一点就是自己的逆矩阵了。将正交矩阵与其转置相乘得到恒等式:

R^TR=I=RR^T\ \ \ for\;orthogonal\;R

这很容易就能看出来,因为R^TR的元素是R列之间的点积。非对角线项是正交向量之间的点积,对角线项是(单位长度)列与其自身的点积。

Example.

矩阵

\left[
\begin{matrix}
8& 0&0 \\
0& 2&0\\
0&0&9
\end{matrix}
\right]

是一个对角矩阵,因此也是对称矩阵,但不是正交矩阵(列与列之间是正交的,但它们不是单位长度)。

矩阵

\left[
\begin{matrix}
1& 1&2 \\
1& 9&7\\
2&7&1
\end{matrix}
\right]

是对称矩阵,但不是对角矩阵,也不是正交矩阵。

矩阵

\left[
\begin{matrix}
0& 1&0 \\
0& 0&1\\
1&0&0
\end{matrix}
\right]

是正交矩阵,但既不是对角矩阵,也不是对称矩阵。

5.3 运用矩阵和行列式进行计算

​ 回想第5.1节,行列式取n个n维向量,并将其组合,得到由向量定义的n维平行六面体的有符号n维体积。例如,二维空间中的行列式是由向量构建的平行四边形区域。我们可以使用矩阵来计算行列式。
​ 假设我们有二维向量rs,我们写出行列式|rs|;该行列式的值,是由向量构成的平行四边形的有向面积。假设我们有两个笛卡尔坐标为(a,b)(A,B)的二维向量(图5.7)。行列式可以用列向量或简写形式表示:

\begin{vmatrix}
\left[
\begin{matrix}
a\\b
\end{matrix}
\right] & \left[
\begin{matrix}
A\\B\\
\end{matrix}
\right] \\

\end{vmatrix}=\begin{vmatrix}
a& A \\
b & B \\

\end{vmatrix}=aB-Ab

请注意,矩阵的行列式与其转置的行列式相等:

\begin{vmatrix}
a& A \\
b & B \\

\end{vmatrix}=\begin{vmatrix}
a& b \\
A & B \\

\end{vmatrix}=aB-Ab

这意味着对于二维中的任何平行四边形,都有一个面积相同但形状不同的“兄弟”平行四边形(图5.8)。例如,由向量(3,1)(2,4)定义的平行四边形的面积是10,由向量(3,2)(1,4)定义的平行四边形面积也是10。

Example.

​ 三维行列式的几何意义有助于理解某些公式的意义。例如,对于i=0,1,2,通过点(xi,yi,zi)的平面方程为:

\left[
\begin{matrix}
x-x_0& x-x_1&x-x_2 \\
y-y_0& y-y_1&y-y_2\\
z-z_0& z-z_1&z-z_2
\end{matrix}
\right]=0

每列都是从点(xi,yi,zi)到点(x,y,z)的向量。只有当点(x,y,z)和其他三个点共面时,以这些向量为边的平行六面体的体积才为零。几乎所有涉及行列式的方程都有类似的简单的几何基础。

​ 如前所述,我们可以简单粗暴的展开行列式进行计算,其中大多数的项为零,并且有大量的正负号。应付行列式代数计算的标准方法是采用一种称为拉普拉斯展开的方式。用这种方法计算行列式的关键是找到矩阵中所有元素的余子式。方阵的每个元素都有一个余子式,余子式是少一行和一列的矩阵的行列式,有时可能要乘以-1。通过消除某个元素所在的行和列,可以获得一个较小的矩阵。例如,对于10×10的矩阵,a_{82}元素的余子式是一个9×9矩阵的行列式,这是通过删除第8行和第2列来获得的。如果元素的行和列索引之和为偶数,则余子式的符号为正,否则为负。这可以通过棋盘格模式记忆:

\left[
\begin{matrix}
+& -&+&-&\cdots \\
-& +&-&+&\cdots\\
+& -&+&-&\cdots \\
-& +&-&+&\cdots\\
\vdots&\vdots &\vdots&\vdots&\ddots
\end{matrix}
\right]

所以,对于一个4\times4的矩阵:

A = \left[
\begin{matrix}
a_{11} &a_{12}& a_{13} &a_{14}\\
a_{21} &a_{22} &a_{23}& a_{24}\\
a_{31} &a_{32}& a_{33}& a_{34}\\
a_{41} &a_{42} &a_{43}& a_{44}\\
\end{matrix}
\right]

第一行元素的余子式如下:

a_{11}^c = \left[
\begin{matrix}
a_{22}& a_{23}& a_{24}\\
a_{32}& a_{33} &a_{34}\\
a_{42} &a_{43} &a_{44}\\
\end{matrix}
\right]\ \ \ \ a_{12}^c = -\left[
\begin{matrix}
a_{21}& a_{23}& a_{24}\\
a_{31}& a_{33} &a_{34}\\
a_{41} &a_{43} &a_{44}\\
\end{matrix}
\right]\\
a_{13}^c = \left[
\begin{matrix}
a_{21}& a_{22}& a_{24}\\
a_{31}& a_{32} &a_{34}\\
a_{41} &a_{42} &a_{44}\\
\end{matrix}
\right]\ \ \ \ a_{14}^c = -\left[
\begin{matrix}
a_{21}& a_{22}& a_{23}\\
a_{31}& a_{32} &a_{33}\\
a_{41} &a_{42} &a_{43}\\
\end{matrix}
\right]

矩阵的行列式是通过求任意行或列的所有元素与其余子式的乘积的总和来求出的。例如上面提到的4\times4矩阵根据其第二列计算的行列式如下:

|A|=a_{12}a_{12}^c+a_{22}a_{22}^c+a_{32}a_{32}^c+a_{42}a_{42}^c

我们可以对任意行或列进行类似的展开,它们都会产生相同的结果。请注意此扩展的递归性质。

Example.

​ 给出了一个特定的3\times3矩阵的行列式,根据其第一行展开:

\left[
\begin{matrix}
0& 1&2 \\
3& 4&5\\
6&7&8
\end{matrix}
\right]=0\left[
\begin{matrix}
4&5 \\
7&8

\end{matrix}
\right]-1\left[
\begin{matrix}
3&5 \\
6&8

\end{matrix}
\right]+2\left[
\begin{matrix}
3&4 \\
6&7

\end{matrix}
\right]\\=0(32-35)-1(24-30)+2(21-24)\\=0

​ 我们可以推断,由列(或行,因为转置后的行列式不变)定义的向量形成的平行六面体的体积为零。这等于说列(或行)不是线性独立的。请注意,第一行和第三行的和是第二行的两倍,这意味着存在线性相关性。

5.3.1 计算逆矩阵

行列式给予了我们计算逆矩阵的工具。对于大型矩阵,运用行列式来计算逆矩阵是一种非常低效的方法,但在图形学中,我们的矩阵通常很小。这种方法会被发展出来,关键的因素是,如果一个矩阵有两行完全相同,那么它所对应的行列式就为零。这很容易理解,如果两条边完全相同,那么n维空间的平行六面体的体积就为零。假设我们有一个4×4的矩阵A,我们希望找到它的逆A^{−1}。它的逆矩阵如下:

A^{-1}=\frac{1}{|A|}A = \left[
\begin{matrix}
a_{11}^c &a_{21}^c& a_{31}^c &a_{41}^c\\
a_{12} ^c&a_{22}^c &a_{32}^c& a_{42}^c\\
a_{13}^c &a_{23}^c& a_{33}^c& a_{43}^c\\
a_{14} ^c&a_{24} ^c&a_{34}^c& a_{44}^c\\
\end{matrix}
\right]

请注意,这只是矩阵的转置,其中A中的元素由其各自的余子式乘以前导数(1-1)替换。这个矩阵称为A的伴随矩阵。伴随矩阵是A的余子式矩阵的转置。我们能够看出,所得的结果为什么是原矩阵的逆。观察AA^{-1}的乘积,我们预期它将会是恒定的。如果我们将A的第一行乘以伴随矩阵的第一列,我们需要得到| A |(记住上面的前导常数要除以| A |):

\left[
\begin{matrix}
a_{11} &a_{12}& a_{13} &a_{14}\\
\cdot &\cdot &\cdot & \cdot \\
\cdot &\cdot &\cdot & \cdot \\
\cdot &\cdot &\cdot & \cdot \\
\end{matrix}
\right] \left[
\begin{matrix}
a_{11}^c &\cdot& \cdot &\cdot\\
a_{12}^c &\cdot& \cdot &\cdot\\
a_{13}^c &\cdot& \cdot &\cdot\\
a_{14}^c &\cdot& \cdot &\cdot\\
\end{matrix}
\right]=\left[
\begin{matrix}
|A| &\cdot& \cdot &\cdot\\
\cdot &\cdot& \cdot &\cdot\\
\cdot &\cdot& \cdot &\cdot\\
\cdot &\cdot& \cdot &\cdot\\
\end{matrix}
\right]

以上的计算结果是正确的,因为A的第一行中的元素正好与伴随矩阵的第一列中的余子式相乘,而这一结果正是行列式。同理,矩阵对角线上的其他值也是|A|。同样的逻辑,其他位置的值就是零:

\left[
\begin{matrix}
\cdot &\cdot &\cdot & \cdot \\
a_{21} &a_{22}& a_{23} &a_{24}\\
\cdot &\cdot &\cdot & \cdot \\
\cdot &\cdot &\cdot & \cdot \\
\end{matrix}
\right] \left[
\begin{matrix}
a_{11}^c &\cdot& \cdot &\cdot\\
a_{12}^c &\cdot& \cdot &\cdot\\
a_{13}^c &\cdot& \cdot &\cdot\\
a_{14}^c &\cdot& \cdot &\cdot\\
\end{matrix}
\right]=\left[
\begin{matrix}
\cdot &\cdot& \cdot &\cdot\\
0 &\cdot& \cdot &\cdot\\
\cdot &\cdot& \cdot &\cdot\\
\cdot &\cdot& \cdot &\cdot\\
\end{matrix}
\right]

值得注意的是,此乘积是某些矩阵的行列式:

a_{21}a_{11}^c+a_{22}a_{12}^c+a_{23}a_{13}^c+a_{24}a_{14}^c

该矩阵实际上是:

A = \left[
\begin{matrix}
a_{21} &a_{22} &a_{23}& a_{24}\\
a_{21} &a_{22} &a_{23}& a_{24}\\
a_{31} &a_{32}& a_{33}& a_{34}\\
a_{41} &a_{42} &a_{43}& a_{44}\\
\end{matrix}
\right]

因为前两行是完全相同的,所以该矩阵是奇异矩阵,因此其行列式为零。
上述论点不仅适用于4\times4矩阵;之所以使用这种尺寸是为了简化排版。对于任意矩阵,逆矩阵就是伴随矩阵除以该矩阵的行列式。伴随矩阵是余子式矩阵的转置,它只是将矩阵中的元素替代为它们的余子式而已。

Example.

​ 行列式为6的特定的3\times3矩阵的逆是:

\left[
\begin{matrix}
1& 1&2 \\
1& 3&4\\
0&2&5
\end{matrix}
\right]^{-1}=\frac{1}{6}\left[
\begin{matrix}
\left[
\begin{matrix}
3&4 \\
2&5

\end{matrix}
\right]& -\left[
\begin{matrix}
1&2 \\
2&5

\end{matrix}
\right]&\left[
\begin{matrix}
1&2 \\
3&4

\end{matrix}
\right] \\
-\left[
\begin{matrix}
1&4 \\
0&5

\end{matrix}
\right]& \left[
\begin{matrix}
1&2 \\
0&5

\end{matrix}
\right]&-\left[
\begin{matrix}
1&2 \\
1&4

\end{matrix}
\right]\\
\left[
\begin{matrix}
1&3 \\
0&2

\end{matrix}
\right]&-\left[
\begin{matrix}
1&1 \\
0&2

\end{matrix}
\right]&\left[
\begin{matrix}
1&1 \\
1&3

\end{matrix}
\right]
\end{matrix}
\right]\\=\frac{1}{6}\left[
\begin{matrix}
7& -1&-2 \\
-5& 5&-2\\
2&-2&2
\end{matrix}
\right]

您可以做一下检查,将矩阵和其逆矩阵相乘,看看是否能获得单位矩阵。

5.3.2 线性方程组

我们经常在图形中遇到“n个方程和n个未知数”的线性方程组,通常n=2或n=3。例如:

3x+7y+2z=\ \ \ 4\\
2x-4y-3z=-1\\
5x+2y+z=\ \ \ \ \ 1

这里的xyz是我们想要求解的“未知数”。我们可以将其写成矩阵形式:

\left[
\begin{matrix}
3& 7&2 \\
2& -4&-3\\
5&2&1
\end{matrix}
\right]\left[
\begin{matrix}
x \\
y\\
z
\end{matrix}
\right]=\left[
\begin{matrix}
4 \\
-1\\
1
\end{matrix}
\right]

这类方程组的一个常用缩写是Ax=b,其中假设A是具有已知常数的方阵,x是未知的列向量(在我们的示例中其中的元素是x、y和z),b是具有已知常数的列矩阵。
求解这类系统的方法有很多,哪种方法合适,这取决于矩阵A的性质和维数。因为在图形学中,我们经常碰到大小为n\leqslant 4的方程组,因此我们将在这里讨论一种适用于这种情形的方法,称为克莱姆法则,我们在前面的第90页的示例中已经见过它了,那是从二维几何的角度来看。现在,我们用代数的方法来表示。上述方程的解为:

x=\frac{\left[
\begin{matrix}
4& 7&2 \\
-1& -4&-3\\
1&2&1
\end{matrix}
\right]}{\left[
\begin{matrix}
3& 7&2 \\
2& -4&-3\\
5&2&1
\end{matrix}
\right]};y=\frac{\left[
\begin{matrix}
3& 4&2 \\
2& -1&-3\\
5&1&1
\end{matrix}
\right]}{\left[
\begin{matrix}
3& 7&2 \\
2& -4&-3\\
5&2&1
\end{matrix}
\right]};z=\frac{\left[
\begin{matrix}
3& 7&4 \\
2& -4&-1\\
5&2&1
\end{matrix}
\right]}{\left[
\begin{matrix}
3& 7&2 \\
2& -4&-3\\
5&2&1
\end{matrix}
\right]}

这里的方法是按比例取行列式,其中分母是|A|,分子是通过用列向量b替换A的列而创建的矩阵的行列式,所替换的列对应于未知向量x中的位置。例如,y是第二个未知列,第二列将被替换。请注意,如果| A |=0,则除法无法定义,所以方程组无解。另一种情况,如果A是奇异的(行列式为零),那么方程就没有唯一的解。

5.4 特征值与矩阵的对角化

方阵拥有特征值和与特征值对应的特征向量。一个非零向量与矩阵相乘后,如果向量的方向不发生变化,就称为特征向量。例如,假设对于矩阵A和向量a,存在下面的等式:

Aa = \lambda a

这意味着,我们对向量a进行了拉伸或者是压缩,但向量的方向没有发生变化。系数\lambda称为与特征向量a相关联的特征值。了解矩阵的特征值和特征向量在各种实际应用中很有用。我们讨论它们,以深入了解几何变换矩阵。并且,下一节中我们将会讨论奇异值和奇异向量,本节知识则是基础。
如果我们假设一个矩阵至少有一个特征向量,那么我们可以用标准操作来找到它。首先,我们将两边都写成一个方阵与向量a的乘积:

Aa = \lambda Ia,

其中I是单位矩阵,移写为:

Aa − \lambda Ia = 0.

由于矩阵乘法是可分配的,我们可以将矩阵分组:

(A − \lambda I) a = 0.

只有当矩阵(A− \lambda I)是奇异的,该等式才成立,因此(A− \lambda I)的行列式为零。矩阵(A− \lambda I)中的元素,除了对角线上的元素,其他元素的值就是矩阵A中的值。例如,对于一个2\times2的矩阵,它的特征是符合以下等式:

\begin{vmatrix}
a_{11}-\lambda& a_{12} \\
a_{21}& a_{22}-\lambda\\

\end{vmatrix}=\lambda^2-(a_{11}+a_{22})\lambda+(a_{11}a_{22}-a_{12}a_{21}) =0

因为这是一个二次方程,我们知道\lambda存在两个解。这些解可能是唯一的,也可能不唯一,也可能不是实数解。对n×n矩阵的进行类似的操作将产生一个关于\lambdan次多项式。由于通常不可能找到大于4次的多项式方程的精确显式解,我们只能用解析方法计算4\times4或更小矩阵的特征值。对于更大的矩阵,数值方法是唯一的选择。特征值和特征向量特别简单的一个重要特例是对称矩阵(其中A=A^T)。实对称矩阵的特征值总是实数,如果它们也是不同的,则它们的特征向量是相互正交的。这些矩阵可以转化为对角线形式:

A = QDQ^T,

其中Q是正交矩阵,D是对角矩阵。Q的列是A的特征向量,D的对角线上的元素是A的特征值。将A以这种形式放置也被称为特征值分解,因为它将A分解为显示其特征向量和特征值的更简单的矩阵乘积。
Example.

给出矩阵:

A=\begin{bmatrix}
2 & 1 \\
1 & 1 \\

\end{bmatrix},

下式的解就是A的特征值:

\lambda^2-3\lambda+1=0.

为了表示的紧凑一点,我们取近似值:

\lambda=\frac{3+\sqrt{5}}{2},\approx
\begin{bmatrix}
2.618 \\
0.382 \\

\end{bmatrix}.

现在我们可以找到相关的特征向量。首先是齐次方程的非零(不是x=y=0)解:

\begin{bmatrix}
2-2.618 &1\\
1 & 1-2.618\\

\end{bmatrix}\begin{bmatrix}
x \\
y \\

\end{bmatrix}=\begin{bmatrix}
0 \\
0 \\

\end{bmatrix}.

这大约是(x,y)=(0.8507,0.5257)。需要注意的是,实际上存在无穷多个解平行于二维向量,我们只选取了单位长度的解。类似地,与\lambda_2相关的特征向量为(x,y)=(−0.5257, 0.8507). 这意味着A的对角线形式是(由于我们的数值近似,精度在一定范围内):

\begin{bmatrix}
2 & 1 \\
1 & 1 \\

\end{bmatrix}=\begin{bmatrix}
0.8507 & -0.5257 \\
0.5257 & 0.8507 \\

\end{bmatrix}\begin{bmatrix}
2.618 & 0 \\
0 & 0.382 \\

\end{bmatrix}\begin{bmatrix}
0.8507 & 0.5257 \\
-0.5257 & 0.8507 \\

\end{bmatrix}.

在下一章中,我们将重新讨论这个矩阵,是以变换的角度讨论其几何意义。

5.4.1奇异值分解

我们在上一节中看到,任何对称矩阵都可以对角化,或分解为方便实用的正交矩阵和对角矩阵的乘积形式。然而,我们在图形中遇到的大多数矩阵都是非对称的,非对称矩阵的特征值分解基本上不会太方便也没有什么启发性,并且即使矩阵是实数矩阵,通常也会涉及复数特征值和特征向量。
对称特征值分解的另一个推广是非对称(甚至非方)矩阵;这就是奇异值分解(SVD)。对称矩阵的特征值分解和非对称矩阵的奇异值分解之间的主要区别在于,在奇异值分解中,左侧和右侧的正交矩阵不需要相同:

A = USV^T.

这里UV是两个可能会不相同的正交矩阵,UV的列分别被称为A的左奇异向量和右奇异向量,S是对角线矩阵,其元素称为A的奇异值。当A对称且所有特征值都为非负时,奇异值分解和特征值分解是相同的。
奇异值和特征值之间还存在另一种关系,可用于计算奇异值分解(尽管这不是工业强度的奇异值分解实现的工作方式)。首先我们定义M=AA^T。我们假设我们可以在M上进行奇异值的分解:

M = AA^T = (USV^T)(USV^T)^T = US(V^TV)SU^T = US^2U^T.

替换得以实现是因为(BC)^T=C^TB^T,且正交矩阵的转置是其逆矩阵,对角矩阵的转置是矩阵本身。这种新形式的美妙之处在于M是对称的,US^2U^T是其特征值分解,其中S^2包含(所有非负)特征值。因此,我们会发现矩阵的奇异值是矩阵与其转置的乘积的特征值的平方根,左奇异向量是该乘积的特征向量。相似的,矩阵的右奇异向量能从A^TA中获得。

Example.

我们现在用一个例子来具体说明:

A=\begin{bmatrix}
1& 1 \\
0& 1 \\

\end{bmatrix};M=AA^T=\begin{bmatrix}
2 & 1 \\
1 & 1 \\

\end{bmatrix}

从之前的部分我们能得到这个矩阵的特征值分解。我们立即观察:

\begin{bmatrix}
1& 1 \\
0& 1 \\

\end{bmatrix}=\begin{bmatrix}
0.8507 & -0.5257 \\
0.5257 & 0.8507 \\

\end{bmatrix}\begin{bmatrix}
\sqrt{2.618} & 0 \\
0 & \sqrt{0.382} \\

\end{bmatrix}V^T.

我们可以用代数方法求解V:

V = (S^{−1}U^TA)^T.

S的逆矩阵是一个对角矩阵,填充的元素则是S的对角元素的倒数。这就产生了:

\begin{bmatrix}
1& 1 \\
0& 1 \\

\end{bmatrix}=U\begin{bmatrix}
\sigma_1& 0 \\
0& \sigma_2 \\

\end{bmatrix}V^T \\
=\begin{bmatrix}
0.8507 & -0.5257 \\
0.5257 & 0.8507 \\

\end{bmatrix}\begin{bmatrix}
1.618 & 0 \\
0 & 0.618 \\

\end{bmatrix}\begin{bmatrix}
0.5257 & 0.8507 \\
-0.8507 & 0.5257 \\

\end{bmatrix}.

这种形式使用了标准符号\sigma_i表示第i个奇异值。同样,对于对称矩阵,特征值和奇异值是相同的(\sigma_i=\lambda_i)。我们将在第6.1.6节中进一步审视奇异值分解的几何意义。

常见问题

  • ## 为什么矩阵乘法的定义方式不是一个元素乘以一个元素?

元素与元素一对一的乘法的确是定义矩阵乘法的一种非常好的方法,它确实也具有很好的特性。然而,在实践中,它不是很有用。从目的来说,大多数矩阵都被用于变换列向量,例如,在三维空间中,您可能会看到:

b=Ma,

其中ab为向量,M3\times3矩阵。为了实现旋转等几何操作,向量a作为三个元素的组合,必须全部进入b的每个元素中。这就要求我们要将a逐行或逐列的通过M的变换。将具有某种属性的矩阵组合起来,我们能够使用一个复合矩阵C=M_2M_1来变换向量。

M_2(M_1a)=(M_2M_1)a

当多个向量由同一个复合矩阵变换时,这一点很有价值。总之,矩阵乘法这条有点奇怪的规则被设计成出来就是为了满足这些特殊要求。

  • ## 有时我听说特征值和奇异值是一回事,有时一个是另一个的平方。哪个是对的?

如果实矩阵a是对称的,且其特征值是非负的,则其特征值和奇异值是相同的。如果A是非对称的,则矩阵M=AA^T是对称的,并且具有非负的实特征值。AA^T的奇异值是相同的,并且是M的奇异值/特征值的平方根。因此,当我们谈到平方根时,这是因为讨论了两个不同的矩阵(具有非常特殊的关系):M=AA^T