《Fundamentals of Computer Graphics》5th(计算机图形学基础/虎书),中文翻译。
第 6 章 Linear Algebra 线性代数
或许,图形程序中最通用的工具是变换点和向量的矩阵。在下一章中,我们将看到如何将向量表示为具有单个列的矩阵,并且如何通过与矩阵相乘的方式在不同基础上表示向量。我们还将描述如何使用这样的乘法来实现对向量的缩放、旋转和平移等变化。在本章中,我们从几何角度回顾基本的线性代数,着重于直觉和在二维和三维情况下有效的算法。
如果读者已经掌握了线性代数,可以跳过本章。但是,即使对于这样的读者,也可能会有一些启发性的内容,例如行列式的发展以及奇异值分解和特征值分解的讨论。
图 6.1:平行四边形的带符号面积是 ∣ a b ∣ |ab| ∣ ab ∣ ,在这种情况下,面积为正。
6.1 Determinants 行列式
通常,我们认为行列式是在线性方程组的求解中出现的。但是,对于我们的目的,我们将行列式视为向量另一种乘法方式。对于二维向量 a \bold a a 和 b \bold b b ,行列式 ∣ a b ∣ |\bold a\bold b| ∣ ab ∣ 是由 a \bold a a 和 b \bold b b 形成的平行四边形的面积(图 6.1)。这是一个带符号的面积,如果 a \bold a a 和 b \bold b b 是右手系,则符号为正,如果它们是左手系,则符号为负。这意味着 ∣ a b ∣ = − ∣ b a ∣ |\bold a\bold b|=-|\bold b\bold a| ∣ ab ∣ = − ∣ ba ∣ 。在 2D 中,“右手系”表示我们将第一个向量逆时针旋转以关闭到第二个向量最小的夹角。在 3D 中,必须同时使用三个向量来计算行列式。对于三个三维向量 a \bold a a 、b \bold b b 和 c \bold c c ,行列式 ∣ a b c ∣ |\bold a\bold b\bold c| ∣ abc ∣ 是由三个向量形成的平行六面体(3D 平行四边形;一个倾斜的 3D 盒子)的有符号体积(图 6.2)。要计算一个二维行列式,我们首先需要建立一些其特性。我们注意到,缩放平行四边形的一侧会以相同的分数缩放其面积(图 6.3):
∣ ( k a ) b ∣ = ∣ a ( k b ) ∣ = k ∣ a b ∣ |(k\bold a)\bold b|=|\bold a(k\bold b)| = k|\bold a\bold b| ∣ ( k a ) b ∣ = ∣ a ( k b ) ∣ = k ∣ ab ∣
图 6.2:所示平行六面体的有符号体积由行列式 ∣ a b c ∣ |\bold a\bold b\bold c| ∣ abc ∣ 表示,在这种情况下,由于向量形成一个右手系基底,所以体积是正的。
图 6.3:沿一方向缩放平行四边形会以相同的比例改变其面积。
此外,我们注意到,“剪切”一个平行四边形不会改变它的面积(图 6.4):
∣ ( a + k b ) b ∣ = ∣ a ( b + k a ) ∣ = ∣ a b ∣ |(\bold a+k\bold b)\bold b|=|\bold a(\bold b+k\bold a)|=|\bold a\bold b| ∣ ( a + k b ) b ∣ = ∣ a ( b + k a ) ∣ = ∣ ab ∣
图 6.4:剪切一个平行四边形不会改变它的面积。这四个平行四边形具有相同的长度基线,因此具有相同的面积。
最后,我们看到行列式具有以下性质:
∣ ( a + k b ) b ∣ = ∣ a ( b + k a ) ∣ = ∣ a b ∣ 。 (6.1) |(\bold a+k\bold b)\bold b|=|\bold a(\bold b+k\bold a)|=|\bold a\bold b|。\tag {6.1} ∣ ( a + k b ) b ∣ = ∣ a ( b + k a ) ∣ = ∣ ab ∣ 。 ( 6.1 )
因为如图 6.5 所示,我们可以“滑动”两个平行四边形之间的边缘,形成一个单独的平行四边形,而不改变两个原始平行四边形的面积。
图 6.5:公式 6.1 背后的几何形状。左侧的两个平行四边形都可以被剪切以覆盖右侧的单个平行四边形。
现在让我们假设 a \bold a a 和 b \bold b b 具有笛卡尔坐标表示:
∣ a b ∣ = ∣ ( x a x + y a y ) ( x b x + y b y ) ∣ = x a x b ∣ x x ∣ + x a y b ∣ x y ∣ + y a x b ∣ y x ∣ + y a y b ∣ y y ∣ = x a x b ( 0 ) + x a y b ( + 1 ) + y a x b ( − 1 ) + y a y b ( 0 ) = x a y b − y a x b . \begin{aligned}
|\mathbf{a b}| & =\left|\left(x_{a} \mathbf{x}+y_{a} \mathbf{y}\right)\left(x_{b} \mathbf{x}+y_{b} \mathbf{y}\right)\right| \\
& =x_{a} x_{b}|\mathbf{x x}|+x_{a} y_{b}|\mathbf{x y}|+y_{a} x_{b}|\mathbf{y} \mathbf{x}|+y_{a} y_{b}|\mathbf{y} \mathbf{y}| \\
& =x_{a} x_{b}(0)+x_{a} y_{b}(+1)+y_{a} x_{b}(-1)+y_{a} y_{b}(0) \\
& =x_{a} y_{b}-y_{a} x_{b} .
\end{aligned} ∣ ab ∣ = ∣ ( x a x + y a y ) ( x b x + y b y ) ∣ = x a x b ∣ xx ∣ + x a y b ∣ xy ∣ + y a x b ∣ yx ∣ + y a y b ∣ yy ∣ = x a x b ( 0 ) + x a y b ( + 1 ) + y a x b ( − 1 ) + y a y b ( 0 ) = x a y b − y a x b .
这个简化使用了一个事实,即对于任何向量 v \bold v v ,∣ v v ∣ = 0 |\bold v\bold v|=0 ∣ vv ∣ = 0 ,因为所有平行四边形都与 v \bold v v 共线,因此没有面积。
在三维中,三个三维向量 a \bold a a 、b \bold b b 和 c \bold c c 的行列式用 ∣ a b c ∣ |\bold a\bold b\bold c| ∣ abc ∣ 表示。对于向量的笛卡尔表示,平行六面体也有类似于平行四边形的规则,并且我们可以进行类似于二维的扩展:
∣ a b c ∣ = ∣ ( x a x + y a y + z a z ) ( x b x + y b y + z b z ) ( x c x + y c y + z c z ) ∣ = x a y b z c − x a z b y c − y a x b z c + y a z b x c + z a x b y c − z a y b x c \begin{aligned}
|\mathbf{a b c}| & =\left|\left(x_{a} \mathbf{x}+y_{a} \mathbf{y}+z_{a} \mathbf{z}\right)\left(x_{b} \mathbf{x}+y_{b} \mathbf{y}+z_{b} \mathbf{z}\right)\left(x_{c} \mathbf{x}+y_{c} \mathbf{y}+z_{c} \mathbf{z}\right)\right| \\
& =x_{a} y_{b} z_{c}-x_{a} z_{b} y_{c}-y_{a} x_{b} z_{c}+y_{a} z_{b} x_{c}+z_{a} x_{b} y_{c}-z_{a} y_{b} x_{c}
\end{aligned} ∣ abc ∣ = ∣ ( x a x + y a y + z a z ) ( x b x + y b y + z b z ) ( x c x + y c y + z c z ) ∣ = x a y b z c − x a z b y c − y a x b z c + y a z b x c + z a x b y c − z a y b x c
正如您所看到的,使用这种方法计算行列式随着维数的增加而变得更加复杂。我们将在第 6.3 节中讨论计算行列式的更少出错的方法。
示例 2 行列式在计算一个向量作为两个其他向量的线性组合时自然而然地出现——例如,如果我们希望将一个向量 c \bold c c 表示为向量 a \bold a a 和 b \bold b b 的组合:
c = a c a + b c b \bold c = a_c \bold a + b_c \bold b c = a c a + b c b
图 6.6:左侧,向量 c 可以使用两个基向量表示为 aca+bcb。右侧,我们看到由 a 和 c 形成的平行四边形是由 bcb 和 a 形成的平行四边形的倾斜版本。
从图 6.6 中,我们可以看到
∣ ( b c b ) a ∣ = ∣ c a ∣ |(b_c\bold b)\bold a|=|\bold c\bold a| ∣ ( b c b ) a ∣ = ∣ ca ∣
因为这些平行四边形只是彼此倾斜的版本。解出 bc 得到
b c = ∣ c a ∣ ∣ b a ∣ b_c = {|\bold c\bold a| \over |\bold b\bold a|} b c = ∣ ba ∣ ∣ ca ∣
一个类似的推理得出
a c = ∣ b c ∣ ∣ b a ∣ a_c = {|\bold b\bold c| \over |\bold b\bold a|} a c = ∣ ba ∣ ∣ bc ∣
这是 Cramer 法则的二维版本,我们将在第 6.3.2 节中重新讨论它。
6.2 Matrices 矩阵
矩阵是遵循某些算术规则的数字元素数组。具有两行三列的矩阵的示例为
[ 1.7 − 1.2 4.2 3.0 4.5 − 7.2 ] \begin{bmatrix}
1.7 & −1.2 & 4.2 \\
3.0 & 4.5 & −7.2
\end{bmatrix} [ 1.7 3.0 − 1.2 4.5 4.2 − 7.2 ]
在计算机图形学中,矩阵经常用于表示空间变换等多种目的。对于我们的讨论,假设矩阵的元素都是实数。本章描述了矩阵算术的机制以及“方”矩阵(即具有相同行列数的矩阵)的行列式。
6.2.1 矩阵算术
矩阵乘以一个常数会得到一个矩阵,其中每个元素都乘以该常数,例如,
2 [ 1 − 4 3 2 ] = [ 2 − 8 6 4 ] 2 \begin{bmatrix}1 & -4 \\ 3 & 2\end{bmatrix} = \begin{bmatrix}2 & -8 \\ 6 & 4\end{bmatrix} 2 [ 1 3 − 4 2 ] = [ 2 6 − 8 4 ]
矩阵也可以逐元素相加,例如:
[ 1 − 4 3 2 ] + [ 2 2 2 2 ] = [ 2 − 2 5 4 ] \begin{bmatrix}1 & -4 \\ 3 & 2\end{bmatrix} + \begin{bmatrix}2 & 2 \\ 2 & 2\end{bmatrix} = \begin{bmatrix}2 & -2 \\ 5 & 4\end{bmatrix} [ 1 3 − 4 2 ] + [ 2 2 2 2 ] = [ 2 5 − 2 4 ]
对于矩阵乘法,我们“将”第一个矩阵的行与第二个矩阵的列相乘:
因此,第 i i i 行第 j j j 列的元素 p i j p_{ij} p ij 为
p i j = a i 1 b 1 j + a i 2 b 2 j + . . . + a i m b m j (6.2) p_{ij}=a_{i1}b_{1j} + a_{i2}b_{2j} + ... + a_{im}b_{mj} \tag {6.2} p ij = a i 1 b 1 j + a i 2 b 2 j + ... + a im b mj ( 6.2 )
仅当左矩阵的列数与右矩阵的行数相同时,才能取两个矩阵的积。例如,
在大多数情况下,矩阵乘法不满足 交换律:
A B ≠ B A (6.3) \bold A\bold B ≠ \bold B\bold A \tag{6.3} AB = BA ( 6.3 )
此外,如果 A B = A C \bold A\bold B = \bold A\bold C AB = AC ,则并不一定意味着 B = C \bold B = \bold C B = C 。幸运的是,矩阵乘法满足 结合律和分配律:
( A B ) C = A ( B C ) , A ( B + C ) = A B + A C , ( A + B ) C = A C + B C . (\bold A\bold B)\bold C = \bold A(\bold B\bold C), \\
\bold A(\bold B+\bold C) = \bold A\bold B+\bold A\bold C, \\
(\bold A+\bold B)\bold C = \bold A\bold C+\bold B\bold C. ( AB ) C = A ( BC ) , A ( B + C ) = AB + AC , ( A + B ) C = AC + BC .
6.2.2 矩阵操作
我们想要一个矩阵的倒数类比于实数的倒数。我们知道实数 x x x 的倒数是 1 / x 1/x 1/ x ,并且 x 和它的倒数的乘积为 1 1 1 。我们需要一个可以被视为“矩阵一”的矩阵 I \bold I I 。这仅适用于方阵,称为单位矩阵;它由对角线上的 1 1 1 组成,其他地方都是零。例如,4 × 4 4×4 4 × 4 的单位矩阵为
I = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \bold I = \begin{bmatrix}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix} I = ⎣ ⎡ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ⎦ ⎤
矩阵 A \bold A A 的逆矩阵 (inverse matrix) A − 1 \bold A^{-1} A − 1 是确保 A A − 1 = I \bold A\bold A^{-1}=\bold I A A − 1 = I 的矩阵。例如,
请注意,A − 1 \bold A^{-1} A − 1 的逆矩阵是 A \bold A A 。因此,A A − 1 = A − 1 A = I \bold A\bold A^{-1} = \bold A^{-1}\bold A = \bold I A A − 1 = A − 1 A = I 。两个矩阵的积的逆矩阵是其逆矩阵的乘积,但顺序相反:
( A B ) − 1 = B − 1 A − 1 (6.4) (\bold A\bold B)^{−1} = \bold B^{−1}\bold A^{−1} \tag{6.4} ( AB ) − 1 = B − 1 A − 1 ( 6.4 )
我们将在第 6.3 节中回到计算逆矩阵的问题。
矩阵 A \bold A A 的转置 A T \bold A^T A T 具有相同的数字,但行与列交换。如果我们将 A T \bold A^T A T 的条目标记为 a i j ′ a'_{ij} a ij ′ ,则
a i j = a j i ′ a_{ij} = a'_{ji} a ij = a ji ′
例如,
[ 1 2 3 4 5 6 ] T = [ 1 3 5 2 4 6 ] \begin{bmatrix}1 & 2 \\ 3 & 4 \\ 5 & 6\end{bmatrix}^T = \begin{bmatrix}1 & 3 & 5 \\ 2 & 4 & 6\end{bmatrix} ⎣ ⎡ 1 3 5 2 4 6 ⎦ ⎤ T = [ 1 2 3 4 5 6 ]
两个矩阵的乘积的转置服从类似于公式 (6.4) 的规则:
( A B ) T = B T A T (\bold A\bold B)^T = \bold B^T\bold A^T ( AB ) T = B T A T
方阵的行列式就是将矩阵的列作为向量集合考虑的列式。行列式与刚才讨论的矩阵运算有几种良好的关系,我们在此列出供参考:
∣ A B ∣ = ∣ A ∣ ∣ B ∣ (6.5) |\bold A\bold B| = |\bold A||\bold B| \tag{6.5} ∣ AB ∣ = ∣ A ∣∣ B ∣ ( 6.5 )
|\bold A^{−1}| = {1 \over |\bold A|} \tag{6.6}
∣ A T ∣ = ∣ A ∣ (6.7) |\bold A^T| = |\bold A| \tag{6.7} ∣ A T ∣ = ∣ A ∣ ( 6.7 )
6.2.3 矩阵形式的向量操作
在图形学中,我们使用方阵将表示为矩阵的向量进行变换。例如,如果您有一个二维向量 a = ( x a , y a ) \bold a = (x_a, y_a) a = ( x a , y a ) ,并希望将其绕原点旋转 90 90 90 度形成向量 a = ( − y a , x a ) \bold a=(−y_a, x_a) a = ( − y a , x a ) ,则可以使用一个 2 × 2 2×2 2 × 2 矩阵和一个称为列向量 (column vector) 的 2 × 1 2×1 2 × 1 矩阵的乘积。矩阵形式的操作为
[ 0 − 1 1 0 ] [ x a y a ] = [ − y a x a ] \begin{bmatrix}0 & -1 \\ 1 & 0\end{bmatrix} \begin{bmatrix}x_a \\ y_a\end{bmatrix} = \begin{bmatrix}-y_a \\ x_a\end{bmatrix} [ 0 1 − 1 0 ] [ x a y a ] = [ − y a x a ]
我们可以通过使用该矩阵的转置并在左侧(“前乘”)使用行向量来获得相同的结果:
[ x a y a ] [ 0 − 1 1 0 ] = [ − y a x a ] \begin{bmatrix}x_a & y_a\end{bmatrix} \begin{bmatrix}0 & -1 \\ 1 & 0\end{bmatrix} = \begin{bmatrix}-y_a & x_a\end{bmatrix} [ x a y a ] [ 0 1 − 1 0 ] = [ − y a x a ]
如今,使用列向量进行后乘是相当标准的,但在许多旧书和系统中,您会遇到行向量和前乘。唯一的区别是必须用其转置替换变换矩阵。
我们也可以使用矩阵形式对向量上的操作进行编码。如果我们将点积的结果视为 1 × 1 1×1 1 × 1 矩阵,则可以写成 a ⋅ b = a T b \bold a · \bold b = \bold a^T\bold b a ⋅ b = a T b
例如,如果我们考虑两个三维向量,则有
[ x a y a z a ] [ x b y b z b ] = [ x a x b + y a y b + z a z b ] \begin{bmatrix}x_a & y_a & z_a\end{bmatrix} \begin{bmatrix}x_b \\ y_b \\ z_b\end{bmatrix} = \begin{bmatrix}x_ax_b+y_ay_b+z_az_b\end{bmatrix} [ x a y a z a ] ⎣ ⎡ x b y b z b ⎦ ⎤ = [ x a x b + y a y b + z a z b ]
相关的向量乘积是两个向量的外积,可以表示为左侧的列向量和右侧的行向量的矩阵乘法:a b T \bold a\bold b^T a b T 。结果是一个由 a \bold a a 的每个条目与 b \bold b b 的每个条目的乘积组成的矩阵。对于三维向量,我们有
[ x a y a z a ] [ x b y b z b ] = [ x a x b x a y b x a z b y a x b y a y b y a z b z a x b z a y b z a z b ] \begin{bmatrix}x_a \\ y_a \\ z_a\end{bmatrix} \begin{bmatrix}x_b & y_b & z_b\end{bmatrix} =
\begin{bmatrix}
x_a x_b & x_a y_b & x_a z_b \\
y_a x_b & y_a y_b & y_a z_b \\
z_a x_b & z_a y_b & z_a z_b
\end{bmatrix} ⎣ ⎡ x a y a z a ⎦ ⎤ [ x b y b z b ] = ⎣ ⎡ x a x b y a x b z a x b x a y b y a y b z a y b x a z b y a z b z a z b ⎦ ⎤
通常情况下,以向量操作的形式思考矩阵乘法很有用。为了说明三维情况,我们可以将 3×3 矩阵视为两种方式的三个三维向量的集合:要么是由三个并排的列向量组成,要么是由三个堆叠的行向量组成。例如,矩阵向量乘积 y = A x \bold y=\bold A\bold x y = Ax 的结果可以解释为其条目是 x \bold x x 与 A \bold A A 的行之间点积的结果。设这些行向量为 r i \bold r_i r i ,则有
或者,我们可以将相同的乘积视为 A \bold A A 的三列 c i \bold c_i c i 的加权和,权值为 x \bold x x 的条目:
使用相同的思想,我们可以理解矩阵-矩阵乘积 A B \bold A\bold B AB 为一个数组,其中包含 A \bold A A 的所有行与 B \bold B B 的所有列的成对点积(参见 (6.2));作为 A \bold A A 与 B \bold B B 的所有列向量的乘积的集合,从左到右排列;作为 A \bold A A 的所有行向量与 B \bold B B 的矩阵的乘积的集合,从上到下堆叠;或者作为 A \bold A A 的所有列与 B \bold B B 的所有行的成对外积之和。 (见练习 8)
这些矩阵乘法的解释经常会导致有价值的几何解释,否则这些操作可能会显得非常抽象。
6.2.4 特殊类型的矩阵
单位矩阵是对角线矩阵 (diagonal matrix) 的一个例子,其中所有非零元素都出现在对角线上。对角线由那些列索引等于从左上角开始计数的行索引的元素组成。
单位矩阵还具有它与其转置相同的属性。这样的矩阵称为对称矩阵 (symmetric)。
单位矩阵也是正交矩阵 (orthogonal matrix),因为将其列视为向量时,每个列的长度均为 1 1 1 ,并且列两两正交。行也是如此(见练习 2)。任何正交矩阵的行列式都是 + 1 +1 + 1 或 – 1 –1 –1 。
正交矩阵的思想对应于标准正交基的思想,不仅仅是一组正交向量——这是术语上的一个不幸漏洞。
正交矩阵非常有用的一个特性是,它们几乎是自身的逆矩阵。将正交矩阵与其转置相乘得到单位矩阵,
R T R = I = R R T (其中 R 是正交矩阵) \bold R^T\bold R= \bold I = \bold R\bold R^T \space (其中 \bold R 是正交矩阵) R T R = I = R R T (其中 R 是正交矩阵)
这很容易理解,因为 R T R \bold R^T\bold R R T R 的条目是 R \bold R R 的列之间的点积。非对角线条目是正交向量之间的点积,而对角线条目是(单位长度的)列与自身的点积。
例 3 矩阵
[ 8 0 0 0 2 0 0 0 9 ] \begin{bmatrix}8 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 9\end{bmatrix} ⎣ ⎡ 8 0 0 0 2 0 0 0 9 ⎦ ⎤
是对角线矩阵,因此是对称矩阵,但不是正交矩阵(列是正交的,但它们的长度不是单位长度)。
矩阵
[ 1 1 2 1 9 7 2 7 1 ] \begin{bmatrix}1 & 1 & 2 \\ 1 & 9 & 7 \\ 2 & 7 & 1\end{bmatrix} ⎣ ⎡ 1 1 2 1 9 7 2 7 1 ⎦ ⎤
是对称矩阵,但不是对角线矩阵或正交矩阵。
矩阵
[ 0 1 0 0 0 1 1 0 0 ] \begin{bmatrix}0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0\end{bmatrix} ⎣ ⎡ 0 0 1 1 0 0 0 1 0 ⎦ ⎤
是正交矩阵,但既不是对角线矩阵也不是对称矩阵。
6.3 使用矩阵和行列式计算
回顾第 6.1 节,行列式将 n \bold n n 个 n \bold n n 维向量结合起来,得到由这些向量定义的 n \bold n n 维平行六面体的带符号 n \bold n n 维体积。例如,在 2D 中,行列式是由向量形成的平行四边形的面积。我们可以使用矩阵处理计算行列式的机制。
如果我们有 2D 向量 r \bold r r 和 s \bold s s ,我们表示行列式 ∣ r s ∣ |\bold r\bold s| ∣ rs ∣ ;此值是由向量形成的平行四边形的带符号面积。假设我们有两个具有笛卡尔坐标 ( a , b ) (\bold a,\bold b) ( a , b ) 和 ( A , B ) (\bold A,\bold B) ( A , B ) 的 2D 向量(图 6.7)。行列式可以用列向量表示或作为一种简写:
∣ [ a b ] [ A B ] ∣ ≡ ∣ a A b B ∣ = a B − A b . (6.8) \left|\left[\begin{array}{l}
a \\
b
\end{array}\right] \quad\left[\begin{array}{l}
A \\
B
\end{array}\right]\right| \equiv\left|\begin{array}{ll}
a & A \\
b & B
\end{array}\right|=a B-A b . \tag{6.8} ∣ ∣ [ a b ] [ A B ] ∣ ∣ ≡ ∣ ∣ a b A B ∣ ∣ = a B − A b . ( 6.8 )
请注意,一个矩阵的行列式与其转置矩阵的行列式相同:
∣ a A b B ∣ = ∣ a b A B ∣ = a B − A b . \left|\begin{array}{ll}
a & A \\
b & B
\end{array}\right|=\left|\begin{array}{ll}
a & b \\
A & B
\end{array}\right|=a B-A b . ∣ ∣ a b A B ∣ ∣ = ∣ ∣ a A b B ∣ ∣ = a B − A b .
图 6.7。公式 6.8 中的 2D 行列式是由 2D 向量形成的平行四边形的面积。
这意味着对于任何 2D 平行四边形,都存在一个具有相同面积但不同形状的“兄弟”平行四边形(图 6.8)。例如,由向量 ( 3 , 1 ) (3,1) ( 3 , 1 ) 和 ( 2 , 4 ) (2,4) ( 2 , 4 ) 定义的平行四边形的面积为 10,与由向量 ( 3 , 2 ) (3,2) ( 3 , 2 ) 和 ( 1 , 4 ) (1,4) ( 1 , 4 ) 定义的平行四边形相同。
例 4 3D 行列式的几何意义有助于理解为什么某些公式是有意义的。例如,通过 i = 0 , 1 , 2 i=0,1,2 i = 0 , 1 , 2 时点 ( x i , y i , z i ) (x_i,y_i,z_i) ( x i , y i , z i ) 确定的平面方程为
∣ 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 ∣ = 0 \left|\begin{array}{lll}
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{array}\right|=0 ∣ ∣ x − x 0 y − y 0 z − z 0 x − x 1 y − y 1 z − z 1 x − x 2 y − y 2 z − z 2 ∣ ∣ = 0
图 6.8。兄弟平行四边形与图 6.7 中的平行四边形具有相同的面积。
每个列向量是从点 ( x i , y i , z i ) (x_i,y_i,z_i) ( x i , y i , z i ) 到点 ( x , y , z ) (x,y,z) ( x , y , z ) 的向量。以这些向量为边的平行六面体的体积仅在 ( x , y , z ) (x,y,z) ( x , y , z ) 与另外三个点共面时为零。几乎所有涉及行列式的方程都具有类似简单的基础几何性质。
正如我们之前所看到的,我们可以通过暴力展开(其中大部分项都为零)来计算行列式,并需要进行很多加减号的繁琐工作。计算行列式代数的标准方法是使用一种 Laplace 展开的形式。用这种方式计算行列式的关键部分是找到各种矩阵元素的余子式。方阵的每个元素都具有一个余子式,它是减去对应行和列的项后得到的一个少一行少一列的矩阵的行列式,可能乘以-1。可通过消除问题元素所在的行和列来获得较小的矩阵。例如,对于 10 × 10 10×10 10 × 10 矩阵,a 82 a_{82} a 82 的余子式是去除第 8 行和第 2 列的 9 × 9 9×9 9 × 9 矩阵的行列式。如果行和列索引的总和是偶数,则余子式的符号为正;否则为负。这可以通过棋盘格模式进行记忆:
因此,对于一个 4×4 矩阵,
第一行的余子式为
计算矩阵的行列式是通过将任何行或列的元素与它们的余子式相乘,然后求和。例如,上面的 4 × 4 4×4 4 × 4 矩阵在其第二列处取行列式的值为
我们可以对任何行或列进行类似的展开,并且它们都会得到相同的结果。请注意,这种展开的递归性质。
例 5 通过扩展第一行的余子式,特定 3 × 3 3×3 3 × 3 矩阵的行列式的具体示例为
我们可以推断出由列(或行)定义的向量形成的平行六面体的体积为零。这等价于说列(或行)不是线性独立的。请注意,第一行和第三行的和是第二行的两倍,这意味着它们具有线性相关性。
6.3.1 计算逆矩阵
行列式为我们提供了计算矩阵逆的工具。对于大型矩阵,这是一种非常低效的方法,但在图形学中经常遇到的矩阵往往比较小。开发该方法的关键是,如果一个矩阵有两个相同的行,则其行列式为零。这是因为如果 n \bold n n 维平行六面体的两侧相同,则其体积为零。假设我们有一个 4 × 4 4×4 4 × 4 矩阵 A \bold A A ,我们希望找到它的逆 A − 1 \bold A^{−1} A − 1 。逆矩阵是
请注意,这只是将 A 的元素替换为它们各自的余子式乘以主导常量(1 或-1)后的矩阵的转置。这个矩阵称为 A \bold A A 的伴随矩阵。伴随矩阵是 A 的余子式矩阵的转置。我们可以看到为什么这是一个逆矩阵。看一下乘积 A A − 1 \bold A\bold A^{−1} A A − 1 ,我们期望得到单位矩阵。如果我们将 A \bold A A 的第一行乘以伴随矩阵的第一列,则需得到|A|(请记住上面的主导常量被 ∣ A ∣ |\bold A| ∣ A ∣ 除):
这是正确的,因为 A \bold A A 的第一行中的元素恰好与伴随矩阵的第一列中的它们的余子式相乘,即行列式。出于类似原因,结果矩阵对角线上的其他值也都是 ∣ A ∣ |\bold A| ∣ A ∣ 。零值遵循类似的逻辑:
请注意,这个乘积是某个矩阵的行列式:
a 21 a 11 c + a 22 a 12 c + a 23 a 13 c + a 24 a 14 c a_{21} a_{11}^{c}+a_{22} a_{12}^{c}+a_{23} a_{13}^{c}+a_{24} a_{14}^{c} a 21 a 11 c + a 22 a 12 c + a 23 a 13 c + a 24 a 14 c
事实上,该矩阵为
因为前两行相同,所以该矩阵是奇异的,因此其行列式为零。
上述论证不仅适用于 4 × 4 4×4 4 × 4 矩阵;使用这个大小只是简化排版。对于任何矩阵,逆矩阵都是伴随矩阵除以被求逆的矩阵的行列式。伴随矩阵是余子式矩阵的转置,它只是将其元素替换为它们的余子式后得到的矩阵。
例 6 一个行列式为 6 的特定 3 × 3 3×3 3 × 3 矩阵的逆矩阵为
您可以通过乘以矩阵并确保获得单位矩阵来自行验证这一点。
6.3.2 线性系统
在图形学中,我们经常遇到“n n n 个方程和 n n n 个未知数”的线性系统,通常是 n = 2 n=2 n = 2 或 n = 3 n=3 n = 3 。例如,
3 x + 7 y + 2 z = 4 2 x − 4 y − 3 z = − 1 5 x + 2 y + z = 1 \begin{array}{l}
3 x+7 y+2 z=4 \\
2 x-4 y-3 z=-1 \\
5 x+2 y+z=1
\end{array} 3 x + 7 y + 2 z = 4 2 x − 4 y − 3 z = − 1 5 x + 2 y + z = 1
在这里,x x x 、y y y 和 z z z 是我们希望解决的“未知数”。我们可以将其写成矩阵形式:
[ 3 7 2 2 − 4 − 3 5 2 1 ] [ x y z ] = [ 4 − 1 1 ] \left[\begin{array}{rrr}
3 & 7 & 2 \\
2 & -4 & -3 \\
5 & 2 & 1
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z
\end{array}\right]=\left[\begin{array}{r}
4 \\
-1 \\
1
\end{array}\right] ⎣ ⎡ 3 2 5 7 − 4 2 2 − 3 1 ⎦ ⎤ ⎣ ⎡ x y z ⎦ ⎤ = ⎣ ⎡ 4 − 1 1 ⎦ ⎤
这样的系统的一个常见简写是 A x = b \bold A\bold x = \bold b Ax = b ,其中假定 A \bold A A 是一个具有已知常量的方阵,x \bold x x 是一个未知列向量(在我们的示例中为 x x x 、y y y 和 z z z ),b \bold b b 是一个具有已知常量的列矩阵。
有许多方法可以解决这样的系统,适当的方法取决于矩阵 A \bold A A 的特性和维数。因为在图形中我们经常处理大小为 n ≤ 4 n≤4 n ≤ 4 的系统,所以我们在这里讨论一种适用于这些系统的方法,称为 Cramer's 规则。我们之前从二维几何角度在第 108 页的例子中看到了这一点。这里,我们展示它的代数形式。上述方程的解为
规则是取行列式的比值,其中分母为 ∣ A ∣ |\bold A| ∣ A ∣ ,分子为用向量 b \bold b b 替换 A \bold A A 的一列得到的矩阵的行列式。替换的列对应于向量 x 中未知数的位置。例如,y y y 是第二个未知数,第二列被替换。请注意,如果 ∣ A ∣ = 0 |\bold A|=0 ∣ A ∣ = 0 ,则除法未定义,没有解。这只是另一种规则的版本,即如果 A \bold A A 是奇异的(行列式为零),则方程组没有唯一解。
6.4 特征值和矩阵对角化
Eigenvalues and Matrix Diagonalization
方阵具有与之相关联的特征值和特征向量。特征向量是那些与矩阵相乘时方向不改变的非零向量。例如,假设对于一个矩阵 A \bold A A 和向量 a \bold a a ,我们有
A a = λ a (6.9) \bold A\bold a = λ\bold a \tag{6.9} Aa = λ a ( 6.9 )
这意味着我们拉伸或压缩了 a \bold a a ,但它的方向没有改变。比例因子 λ λ λ 称为与特征向量 a \bold a a 相关联的特征值。了解矩阵的特征值和特征向量在各种实际应用中非常有帮助。我们将描述它们以深入理解几何变换矩阵,并作为下一节所述奇异值和向量的一步。
如果我们假设矩阵至少有一个特征向量,则可以进行标准操作来找到它。首先,我们将两边写成一个矩阵与向量 a \bold a a 的乘积:
A a = λ I a (6.10) \bold A\bold a = λ\bold I\bold a \tag{{6.10}} Aa = λ Ia ( 6.10 )
其中 I \bold I I 是单位矩阵。这可以重写为
A a − λ I a = 0 (6.11) \bold A\bold a−λ\bold I\bold a = 0 \tag{6.11} Aa − λ Ia = 0 ( 6.11 )
因为矩阵乘法是可分配的,我们可以将矩阵分组:
( A − λ I ) a = 0 (6.12) (\bold A−λ\bold I)\bold a = 0 \tag{6.12} ( A − λ I ) a = 0 ( 6.12 )
这个方程只有在矩阵(A − λ I \bold A-λ\bold I A − λ I )是奇异的时才成立,因此它的行列式为零。该矩阵中的元素是 A \bold A A 中的数字,除了对角线上的数字。例如,对于一个 2 × 2 2×2 2 × 2 矩阵,特征值满足
因为这是一个二次方程,我们知道λ有正好两个解。这些解可能是唯一的也可能不是唯一的或者实数。对于 n × n n×n n × n 矩阵,类似的操作将得到一个关于 λ λ λ 的 n n n 次多项式。由于通常不能找到大于四次多项式方程的精确显式解,因此我们只能通过解析方法计算 4 × 4 4×4 4 × 4 或更小的矩阵的特征值。对于更大的矩阵,数值方法是唯一的选择。
特征值和特征向量特别简单的一个重要特殊情况是对称矩阵(其中 A = A T \bold A = \bold A^T A = A T )。实对称矩阵的特征值始终是实数,如果它们还互不相同,则它们的特征向量彼此正交。这样的矩阵可以被放入对角线形式:
A = Q D Q T (6.14) \bold A = \bold Q\bold D\bold Q^T \tag{6.14} A = QD Q T ( 6.14 )
其中 Q \bold Q Q 是正交矩阵,D \bold D D 是对角矩阵。Q \bold Q Q 的列是 A \bold A A 的特征向量,D \bold D D 的对角线元素是 A \bold A A 的特征值。将 A \bold A A 放在这种形式中也称为特征向量分解,因为它将 A \bold A A 分解为更简单的矩阵乘积,揭示了它的特征向量和特征值。
回想一下,正交矩阵具有正交规范化的行和列。
例 7 给定矩阵
A = [ 2 1 1 1 ] \bold A = \begin{bmatrix}2 & 1\\ 1 & 1\end{bmatrix} A = [ 2 1 1 1 ]
A \bold A A 的特征值是方程
λ 2 − 3 λ + 1 = 0. λ^2−3λ+1=0. λ 2 − 3 λ + 1 = 0.
我们为简洁起见近似精确值:
现在我们可以找到相关的特征向量。首先是齐次方程的非平凡解(不是 x=y=0):
[ 2 − 2.618 1 1 1 − 2.618 ] [ x y ] = [ 0 0 ] \left[\begin{array}{cc}
2-2.618 & 1 \\
1 & 1-2.618
\end{array}\right]\left[\begin{array}{l}
x \\
y
\end{array}\right]=\left[\begin{array}{l}
0 \\
0
\end{array}\right] [ 2 − 2.618 1 1 1 − 2.618 ] [ x y ] = [ 0 0 ]
这大约是 ( x , y ) = ( 0.8507 , 0.5257 ) (x,y)=(0.8507,0.5257) ( x , y ) = ( 0.8507 , 0.5257 ) 。注意,有无限多个沿着该二维向量的解,我们只选择长度为 1 1 1 的一个。同样,与 λ 2 λ2 λ 2 相关联的特征向量是 ( x , y ) = ( – 0.5257 , 0.8507 ) (x, y) = (–0.5257, 0.8507) ( x , y ) = ( –0.5257 , 0.8507 ) 。这意味着 A A A 的对角线形式为(由于我们的数字近似而产生一些精度误差):
我们将在下一章中重新讨论这个矩阵作为变换的几何性质。
6.4.1 奇异值分解
我们在上一节中看到,任何对称矩阵都可以对角化,或者分解为方便的正交和对角矩阵的乘积。然而,在图形学中遇到的大多数矩阵并不是对称的,非对称矩阵的特征值分解不太方便或启示性,并且通常涉及复值特征值和特征向量,即使输入是实值的。
我们建议按照以下顺序学习:对称特征值/向量、奇异值/向量,然后再是非对称特征值,这些更加棘手。
还有另一个对非对称(甚至是非方阵)矩阵的对称特征值分解的推广;它是奇异值分解 (singular value decomposition - SVD)。对称矩阵的特征值分解和非对称矩阵的 S V D \bold S\bold V\bold D SVD 之间的主要区别在于,在 S V D \bold S\bold V\bold D SVD 中,左右两边的正交矩阵不需要相同:
A = U S V T \bold A = \bold U\bold S\bold V^T A = US V T
这里,U \bold U U 和 V \bold V V 是两个可能不同的正交矩阵,它们的列被称为 A \bold A A 的左和右奇异向量,S \bold S S 是一个对角线矩阵,其条目被称为 A \bold A A 的奇异值。当 A \bold A A 是对称的且具有所有非负特征值时,SVD 和特征值分解是相同的。
奇异值和特征值之间还有另一种关系,可以用于计算 SVD(尽管这不是工业强度的 SVD 实现方式)。首先,我们定义 M = A A T \bold M = \bold A\bold A\bold T M = AAT 。我们假设我们可以对 M \bold M M 进行 SVD:
该替换基于以下事实:( B C ) T = C T B T (\bold B\bold C)^T=\bold C^T\bold B^T ( BC ) T = C T B T ,正交矩阵的转置是其逆,对角线矩阵的转置是矩阵本身。这种新形式的美妙之处在于 M \bold M M 是对称的,U S 2 U T \bold U\bold S^2\bold U^T U S 2 U T 是其特征值分解,其中 S 2 \bold S^2 S 2 包含(全部非负)特征值。因此,我们发现矩阵的奇异值是矩阵与其转置的乘积的特征值的平方根,左奇异向量是该乘积的特征向量。类似的论证允许从 A T A \bold A^T\bold A A T A 计算右奇异向量的矩阵 V \bold V V 。
例 8 我们现在用一个例子具体说明:
A = [ 1 1 0 1 ] ; M = A A T = [ 2 1 1 1 ] \mathbf{A}=\left[\begin{array}{ll}
1 & 1 \\
0 & 1
\end{array}\right] ; \quad \mathbf{M}=\mathbf{A} \mathbf{A}^{\mathrm{T}}=\left[\begin{array}{ll}
2 & 1 \\
1 & 1
\end{array}\right] A = [ 1 0 1 1 ] ; M = A A T = [ 2 1 1 1 ]
在上一节中,我们看到了这个矩阵的特征值分解。我们立即得出
我们可以代数求解 V:
V = ( S − 1 U T A ) T 。 \bold V=(\bold S^{−1}\bold U^T\bold A)^T。 V = ( S − 1 U T A ) T 。
S 的逆是一个对角线矩阵,其对角线元素为 S 的对角线元素的倒数。这产生了
此形式使用标准符号 σ i σ_i σ i 表示第 i i i 个奇异值。同样,对于对称矩阵,特征值和奇异值是相同的(σ i = λ i σ_i=λ_i σ i = λ i )。我们将在 7.1.6 节进一步研究 SVD 的几何性质。
常见问题
为什么矩阵乘法的定义不是逐个元素相乘?
逐个元素相乘是一种完全合理的定义矩阵乘法的方式,而且它具有良好的性质。然而,在实践中并不太有用。最终,大多数矩阵都用于转换列向量;例如,在三维空间中,您可能会有
b = M a , \bold b=\bold M\bold a, b = Ma ,
其中 a 和 b 是向量,M 是一个 3×3 矩阵。为了允许旋转等几何操作,必须将 a 的所有三个元素组合到 b 的每个元素中。这要求我们通过 M 进行行或列遍历。这种选择基于具有所需属性的矩阵组成,
M 2 ( M 1 a ) = ( M 2 M 1 ) a \bold M_2(\bold M_1\bold a)=(\bold M_2\bold M_1)\bold a M 2 ( M 1 a ) = ( M 2 M 1 ) a
这使我们可以使用一个复合矩阵 C = M 2 M 1 \bold C=\bold M_2\bold M_1 C = M 2 M 1 来变换我们的向量。当许多向量将由同一复合矩阵变换时,这非常有价值。因此,总之,对于矩阵乘法而言略微奇怪规则被设计成具有这些期望属性。
我听说特征值和奇异值是同一件事情,并且有时候一个是另一个平方根?哪个正确?
如果实数矩阵 A \bold A A 对称,并且其特征值非负,则其特征值和奇异值相同。如果 A \bold A A 不对称,则该矩阵 M = A A T \bold M=\bold A\bold A^T M = A A T 对称并且具有非负能实特征值。A \bold A A 和 A T \bold A^T A T 的奇异值相同,并且它们是 M \bold M M 的奇异/特征 值开方得到 。因此,在提到平方根语句时 ,正在谈论两个不同但存在着非常特殊关系 的 系数: M = A A T \bold M = \bold A\bold A^T M = A A T 。
注释
关于行列式作为体积的讨论基于《几何学方法》(Hausner, 1998)。 Hausner 还就向量分析和几何基础进行了优秀探讨 。在二维空间中 Cramer's 规则 几何推导取自《线性代数工具箱》(Farin&Hansford,2004)。该书还包括其他线性代数运算(如高斯消去) 的几何解释 。 特征 值与奇异 值 讨论主要参考自《线性代数及其应用》(Strang,1988)。剪切 系 数 SVD 示例 取自《计算机图形学与几何建模》(Salomon,1999) 中相关内容 .
练习题
使用 2D 行列式写出通过点 ( x 0 , y 0 ) (x_0, y_0) ( x 0 , y 0 ) 和 ( x 1 , y 1 ) (x_1, y_1) ( x 1 , y 1 ) 的 2D 线段的隐式方程。
证明如果矩阵的列向量是正交的,那么它的行向量也是正交的。
证明方程 (6.5) 至 (6.7) 所述的矩阵行列式的性质。
证明对角矩阵的特征值是其对角线元素。
证明对于一个方阵 A A A ,A A T A\mathrm{A}^T A A T 是一个对称矩阵。
证明三个三维向量 a , b , c a, b, c a , b , c 满足如下恒等式:∣ a b c ∣ = ( a × b ) ⋅ c |abc| = (a\times b)\cdot c ∣ ab c ∣ = ( a × b ) ⋅ c 。
解释为什么以向量 a , b , c a, b, c a , b , c 为边所构成四面体的体积(参见图 6.2)等于 ∣ a b c ∣ / 6 |abc|/6 ∣ ab c ∣/6 。
通过重新排列嵌套循环并将结果解释为矩阵和向量操作,演示矩阵-矩阵乘法的四种解释。具体而言,考虑以下矩阵-矩阵乘法代码:
function mat-mult(in a[m][p], in b[p][n], out c[m][n]) {
// the array c is initialized to zero
for i = 1 to m
for j = 1 to n
for k = 1 to p
c[i][j] += a[i][k] * b[k][j]
}
证明如果矩阵 A , Q , D A, Q, D A , Q , D 满足方程 (6.14),v v v 是 Q Q Q 的第 i i i 列,λ \lambda λ 是 D D D 的第 i i i 个对角线条目,则 v v v 是矩阵 A A A 的特征向量,其特征值为 λ \lambda λ 。
证明如果矩阵 A , Q , D A, Q, D A , Q , D 满足方程 (6.14),A A A 的特征值均不同,并且 v v v 是矩阵 A A A 的特征向量,其特征值为 λ \lambda λ ,则 v v v 是 Q Q Q 的第 i i i 行,λ \lambda λ 是 D D D 的第 i i i 个对角线条目。
给定一个二维三角形的三个顶点的 ( x , y ) (x,y) ( x , y ) 坐标,请解释其面积为 12|x0x1x2y0y1y2111|。