或许图形学程序最常用的工具就是能对点或者向量进行变换的矩阵。在下一章节,我们可以看到如何用矩阵表示一个向量,以及如何用向量与方阵相乘表示不同基。我们还将描述如何使用这种乘法来实现向量的变换,如缩放、旋转和平移。
在这一章中,我们从几何的角度来回顾基本的线性代数,在二维三维的情况下着重直觉感知和算法。熟悉线性代数的读者可以跳过本章。然而,即使对于这样的读者,也可能有一些启发性的珍闻,比如行列式的发展以及对奇异和特征值分解的讨论。
图5.1。平行四边形的带符号面积是|ab|,在这种情况下,面积是正的。
我们通常认为行列式出现在线性方程的解中。然而,我们打算将把行列式看作是向量相乘的另一种方法。对于二维向量a和b,行列式|ab|是由a和b组成的平行四边形的面积(图5.1)。这是一个有符号的面积,如果a和b是right-handed,则符号是正的;如果它们是left-handed,则符号是负的。即|ab| =−|ba|。在2D中,我们可以将“right-handed”解释为以逆时针旋转第一个矢量使它到第二个矢量的最小角度。在三维中,行列式必须一次取三个向量。对于三个三维向量a、b和c,行列式|abc|是平行六面体(三维平行四边形;由三个矢量组成的三维剪切盒(图5.2)。为了计算二维行列式,我们首先需要建立它的一些性质。
我们注意到,缩放一个平行四边形的一边,它的面积会以相同的比例缩放(图5.3):
此外,我们注意到“切变”平行四边形不会改变其面积(图5.4):
因为如图5.5所示,我们可以“滑动”两个平行四边形之间的边,形成一个单独的平行四边形,而不改变原来两个平行四边形中的任何一个的面积。
现在让我们假设a和b的笛卡尔表示:
这个化简利用了这样一个事实:对于任意向量v, |vv| = 0,因为平行四边形都与v共线,因此没有面积。
在三维空间中,三个三维向量a, b, c的行列式记为|abc|。有了矢量的笛卡尔表示,平行六面体也有类似的规则,就像平行四边形一样,我们可以做一个类似的展开,就像我们在2D中做的那样:
如你所见,行列式的计算随着维数的增加变得越来越难看。我们将在5.3节中讨论计算行列式的不容易出错的方法。
例如。当计算一个向量作为其他两个向量的线性组合的表达式时,行列式很自然地出现了——例如,如果我们希望将一个向量c表示为向量a和b的组合:
图5.2。所示的平行六面体的有符号体积由行列式|abc|表示,在这种情况下,体积是正的,因为这些向量组成了一组右手基。
图5.3。沿着一个方向缩放一个平行四边形,以相同的比例改变面积。
图5.4。切变一个平行四边形并不改变它的面积。这四个平行四边形底边长度相同,面积也相同。
图5.6。在左边,向量c可以用两个基向量aca + bcb表示。在右边,我们看到由a和c组成的平行四边形是由bcb和a组成的平行四边形的切变版本。
我们可以从图5.6看出
这是Cramer规则的二维版本,我们将在第5.3.2节中重新讨论。
矩阵是遵循一定算术规则的数字元素数组。一个两行三列矩阵的例子
矩阵经常用于计算机图形学,包括空间变换的表示。为了便于讨论,我们假设矩阵的元素都是实数。本章描述矩阵运算的结构和方阵的行列式,即行数与列数相同的方阵。
一个矩阵乘以一个常数会得到一个矩阵,其中每个元素都乘以这个常数,例如,
对于矩阵乘法,我们将第一个矩阵的行与第二个矩阵的列“相乘”:
只有当左矩阵的列数与右矩阵的行数相等时,才能求两个矩阵的乘积。例如,
同样,如果AB = AC,并不一定遵循B = C。幸运的是,矩阵乘法具有结合性和分配性:
我们想要一个模拟实数逆的矩阵。我们知道实数x的倒数是1/x x和它的倒数的乘积是1。我们需要一个矩阵I,我们可以把它想象成“matrix one.”这只存在于方阵,称为单位矩阵;它的对角线全为1和其他地方全为0。例如,4 × 4的单位矩阵是
矩阵A的逆矩阵A−1是保证AA−1 = I的矩阵。例如,
注意A−1的逆矩阵是A,所以AA−1 = A−1A = I。两个矩阵的乘积的逆矩阵是两个逆矩阵的乘积,但顺序颠倒了:
我们将在本章的后面回到计算逆的问题。矩阵a的转置AT有相同的数字但是行和列交换了。如果我们将AT标记为a’ij,那么
方阵的行列式就是矩阵列的行列式,被认为是一组向量。行列式与刚才讨论的矩阵运算有几个很好的关系,我们在这里列出以供参考:
在图形学中,我们用一个方阵来变换一个用矩阵表示的向量。例如,如果您有一个二维向量a = (xa, ya),并想要围绕原点旋转90度以形成向量a’ =(−ya, xa),您可以使用2×2矩阵和2×1矩阵的乘积,称为列向量。矩阵形式的运算是
我们可以通过使用这个矩阵的转置,并在左边乘以一个行向量(“预乘”)得到相同的结果:
现在,使用列向量的后乘法是相当标准的,但在许多旧的书籍和系统中,您会遇到行向量和前乘法。唯一的区别是变换矩阵必须用它的转置来代替。我们也可以用矩阵形式来编码向量上的运算。如果我们把点积的结果看作一个1 × 1矩阵,它可以写成
相关向量的乘积是两个向量之间的外积,可以表示为一个列向量的矩阵乘法在左边和右边一个行向量:abT。结果是一个矩阵由a的元素和b的元素的所有对的积组成。对三维向量我们有,
用向量运算来考虑矩阵乘法通常是有用的。为了说明三维的情况,我们可以把3 × 3矩阵想象成三个三维向量的集合,有两种方式:要么是由三个列向量并排构成,要么是由三个行向量叠加构成。例如,矩阵与向量相乘的结果y = Ax可以解释为一个向量它的元素是x与A的行的点积,我们将这些行向量命名为ri
使用同样的思想,我们可以将矩阵-矩阵乘积AB理解为一个包含A的所有行与B的所有列的成对点积的数组(cf.(5.2));作为矩阵A与B的所有列向量从左到右排列的乘积的集合;作为A的所有行向量与矩阵B的乘积的集合,从上到下堆叠;或者是A的所有列和B的所有行成对的外部积的和(参见练习8)。
这些对矩阵乘法的解释通常对运算会产生有价值的几何解释,否则可能显得非常抽象
单位矩阵是对角矩(a diagonal matrix)的一个例子,其中所有非零元素都出现在对角线上。对角线由那些列索引等于从左上角开始计算的行索引的元素组成。
单位矩阵还有一个性质就是它等于它的转置。这样的矩阵称为对称矩阵。作为一个长度为1的向量并且列向量彼此正交。行也是如此(参见练习2)。任何正交矩阵的行列式要么是+1,要么是- 1。正交矩阵的一个非常有用的性质是它们几乎是它们自己的逆矩阵。用一个正交矩阵乘以它的转置得到单位矩阵,
(单位矩阵也是一个正交矩阵,因为它的每一列正交矩阵的概念对应于标准正交基的概念,而不仅仅是一组正交向量——这是术语中的一个不幸的缺陷。)
这很容易看出来,因为RTR的分量是R的列之间的点积。非对角线分量是正交向量之间的点积,而对角线分量是(单位长度)列与其自身的点积。
矩阵是对角的,因此是对称的,但不是正交的(列是正交的,但不是单位长度)。
回想第5.1节,行列式取n个n维向量,并将它们组合起来,得到由这些向量定义的n维平行六面体的一个有符号的n维体积。例如,二维中的行列式就是由向量组成的平行四边形的面积。我们可以用矩阵来处理计算行列式的机制。如果我们有二维向量r和s,我们表示行列式|rs|;这个值是由向量组成的平行四边形的带符号面积。假设我们有两个二维矢量,笛卡尔坐标(a, b)和(a, b)(图5.7)。行列式可以写成列向量的形式,也可以简写为:
注意,一个矩阵的行列式与其转置的行列式是相同的:
这意味着,对于2D中的任何平行四边形,都存在一个“sibling”平行四边形,它具有相同的面积,但形状不同(图5.8)。例如,由向量(3,1)和(2,4)定义的平行四边形的面积为10,由向量(3,2)和(1,4)定义的平行四边形的面积也是10。
例如。三维行列式的几何意义有助于理解为什么某些公式是有意义的。例如,当i = 0,1,2时,平面通过点(xi, yi, zi)的方程为
每一列是一个从点(xi, yi, zi)到点(x, y, z)的向量。只有当(x, y, z)与其他三个点共面时,以这些向量为边的平行六面体的体积为零。几乎所有涉及行列式的方程都有类似的简单几何基础。
正如我们前面看到的,我们可以通过蛮力展开来计算行列式,其中大多数项为零,并且有大量的加号和减号记录。计算行列式的代数的标准方法是使用拉普拉斯展开的一种形式。用这种方法计算行列式的关键部分是找出各种矩阵元素的余子式。方阵的每个元素都有一个余子式,余子式是一个矩阵的行列式,它的行和列都少一个,可能还要乘以- 1。通过消去所讨论的元素所在的行和列,就可以得到较小的矩阵。例如,对于10×10矩阵,a82的余子式是9×9矩阵的行列式,它的第8行和第2列被消去了。如果列和行指标的和是偶数,则辅因子的符号为正,否则为负。这可以通过一个棋盘模式来记住:
矩阵的行列式是通过取任何行或列的元素及其余子式的乘积的和来求得的。例如,对上面的4 × 4矩阵的第二列行列式取为
我们可以对任意行或列做类似的展开它们都会得到相同的结果。注意这个扩展的递归性质。
一个具体的例子是通过展开第一行的余子式来求一个特定的3 × 3矩阵的行列式
我们可以推导出由列(或行,因为转置的行列式相同)所定义的向量所构成的平行六面体的体积为零。这相当于说列(或行)不是线性无关的。注意,第一行和第三行的和是第二行的两倍,这意味着线性相关。
行列式给了我们一个计算矩阵逆的工具。对于大型矩阵,这是一种效率很低的方法,但在图形中,我们的矩阵通常很小。发展这种方法的一个关键是两个相同行的矩阵的行列式为零。这应该是很清楚的,因为n维平行六面体的体积是零,如果它的两条边是相同的。假设有一个4 × 4 A,我们想求它的逆A−1。相反的是
注意,这只是矩阵的转置,其中A的元素被它们各自的余子式乘以前面的常数(1或-1)所代替。这个矩阵叫做a的伴随矩阵,伴随矩阵是a的余子矩阵的转置,我们可以看到为什么这是一个逆矩阵。看看AA−1这个产品,我们期望它是身份。如果我们用A的第一行乘以伴随矩阵的第一列我们需要得到|A|(记住上面的前导常数除以|A|:
这是对的,因为A第一行的元素与伴随矩阵第一列的余子式相乘而伴随矩阵第一列的余子式就是行列式。由于类似的原因,沿着结果矩阵对角线的其他值是|A|。0的逻辑类似:
因为前两行是相同的,这个矩阵是奇异的,因此,它的行列式是零。
上面的论证并不仅仅适用于4 × 4矩阵;使用这个尺寸只是简化了排版。对于任何矩阵,它的逆矩阵是伴随矩阵除以逆矩阵的行列式。伴随矩阵是余子矩阵的转置,余子矩阵就是其元素被其余子矩阵替换的矩阵。一个特定的行列式为6的3 × 3矩阵的逆是
你可以通过矩阵相乘来验证它确保你得到了单位矩阵
在图形学中,我们经常遇到具有“n个方程和n个未知数”的线性系统,通常是n = 2或n = 3。例如,
这里x, y和z是我们想要求解的“未知数”。我们可以把它写成矩阵形式:
这类系统的常见简写是Ax = b,其中假设A是一个已知常数的方阵,x是一个未知的列向量(在我们的例子中包含x、y和z元素),b是一个已知常数的列矩阵。
有很多方法可以解决这种系统,适当的方法取决于属性和维度的矩阵a。因为在图形我们如此频繁与系统大小n≤4,我们将在这里讨论一个方法适合这些系统,称为克莱姆法则,我们之前看到的,从二维几何的观点,在92页的例子中。这里,我们用代数来证明。上述方程的解是
这里的规则是比例的决定因素,分母是|A |和分子是替换产生的矩阵的行列式的一列与列向量b。列替换对应的位置未知向量x。例如,y是第二个未知,第二列是更换。注意,如果|A| = 0,除法没有定义,没有解。这只是规则的另一个版本,如果A是奇异的(行列式为零),那么方程组就没有唯一解。
方阵有特征值和与之相关的特征向量。特征向量是那些非零向量它们的方向在乘以矩阵时不会改变。例如,假设矩阵a和向量a有
这意味着我们拉伸或压缩了a,但它的方向没有改变。尺度因子λ称为特征向量a对应的特征值
矩阵的特征值和特征向量在许多实际应用中是有帮助的。我们将对它们进行描述,以深入了解几何变换矩阵,并作为迈向奇异值和向量的一步,将在下一节中描述。
如果我们假设一个矩阵至少有一个特征向量,那么我们可以做一个标准的操作来找到它。首先,我们把两边写成一个方阵的乘积对于向量a:
其中I是一个单位矩阵。这个可以重写
只有当矩阵(A - λI)是奇异的,因此它的行列式为零时,这个方程才成立。这个矩阵中的元素是A中的数,除了对角线。例如,对于一个2 × 2矩阵,特征值服从
因为这是一个二次方程,我们知道λ有两个解。这些解可能是唯一的,也可能不是真实的。对n × n矩阵的类似操作将产生一个λ的n次多项式。因为一般来说,不可能找到次数大于4的多项式方程的精确显式解,我们只能通过解析方法计算矩阵的特征值为4 × 4或更小。对于较大的矩阵,数值方法是唯一的选择。
特征值和特征向量特别简单的一个重要特殊情况是对称矩阵(其中A = AT)。实对称矩阵的特征值总是实数,如果它们也是不同的,它们的特征向量是相互正交的。这样的矩阵可以写成对角形式:
其中Q是一个正交矩阵,D是一个对角矩阵。Q的列是A的特征向量,D的对角元素是A的特征值。把A变成这种形式也被称为特征值分解,因为它把A分解成一个更简单的矩阵的乘积,它显示出它的特征向量和特征值。
(回想一下,正交矩阵有标准正交行和标准正交列。)
A的特征值是的解
现在我们可以找到相关的特征向量。第一个是齐次方程的非平凡解(非x = y = 0)
这大约是(x, y) =(0.8507, 0.5257)。注意,有无穷多个平行于这个二维向量的解,我们只是选择了一个单位长度的解。
与λ2相关的特征向量为(x,y)=(−0.5257,0.8507)。这意味着A的对角线形式是(由于我们的数值近似在一定精度范围内):
我们将在下一章中重温这个矩阵的几何变换
我们在上一节中看到任何对称矩阵都可以对角化,或者分解成正交矩阵和对角矩阵的方便乘积。然而,我们在图形中遇到的大多数矩阵都是不对称的,而非对称矩阵的特征值分解并不那么方便或具有启发性,而且通常涉及复值特征值和特征向量,即使是实值输入。
对称特征值分解对非对称(甚至非平方)矩阵有另一种推广;它就是奇异值分解(SVD)。非对称矩阵的特征值分解与非对称矩阵的奇异值分解的主要区别在于,在奇异值分解中,不要求左右两边的正交矩阵是相同的:
(我们建议按照以下顺序学习:对称特征值/向量,奇异值/向量,然后是不对称特征值,这要复杂得多。)
U和V是两个,可能不同,正交矩阵,它的列被称为左和右奇异向量,和S是一个对角矩阵的奇异值的条目被称为A .当一个是对称的,所有非负特征值,计算和特征值分解是相同的。
奇异值和特征值之间还有另一种关系,可以用来计算SVD(尽管这不是工业强度SVD实现的工作方式)。首先我们定义M = AAT。我们假设可以对M进行SVD:
这个替换是基于这样一个事实,即(BC)T = CTBT,正交矩阵的转置就是它的逆,对角矩阵的转置就是矩阵本身。这种新形式的美妙之处在于M是对称的,US2UT是它的特征值分解,其中S2包含(所有非负的)特征值。因此,我们发现一个矩阵的奇异值是它的平方根
这个矩阵与其转置的乘积的特征值,左边的奇异向量就是这个乘积的特征向量。类似的参数允许用ATA计算右奇异向量的矩阵V。现在我们用一个例子来具体说明:
S的逆是一个对角矩阵,它是S对角元素的倒数
这种形式用标准符号σi表示第i个奇异值。同样,对于对称矩阵,特征值和奇异值是相同的(σi = λi)。我们将在第6.1.6节进一步研究SVD的几何结构
元素对元素的乘法是定义矩阵乘法的一个很好的方法,它确实有很好的性质。然而,在实践中它并不十分有用的。最终,大多数矩阵被用于变换列向量,例如,在3D中,你可能有b = Ma,
其中a和b是向量,M是3×3矩阵。为了实现诸如旋转之类的几何操作,a的所有三个元素的组合必须进入b的每个元素。这就要求我们要么一行一行地穿过M,要么一列一列地穿过M。
这个选择是基于矩阵的复合做出的,这些复合矩阵具有所期望的性质,M2(M1a)=(M2M1)a,这允许我们使用一个复合矩阵C = M2M1来变换我们的向量。当许多向量将被同一个复合矩阵变换时,这是很有价值的。所以,总而言之,这个有点奇怪的矩阵乘法规则被设计成具有这些期望的性质。
如果一个实矩阵a是对称的,其特征值是非负的,那么它的特征值和奇异值是相同的。如果A不对称,则矩阵M = AAT是对称的,且具有非负的实特征值。A和AT的奇异值是相同的,是m的奇异/特征值的平方根。因此,当提出平方根命题时,是因为讨论的是两个不同的矩阵(具有非常特殊的关系):
M = AAT.
作为体积的行列式的讨论是基于几何的向量空间方法(Hausner, 1998)。豪斯纳对矢量分析和几何基础也有很好的讨论。Cramer法则在2D中的几何推导取自《实用线性代数:一个几何工具箱》(Farin & Hansford, 2004)。那本书也有其他线性代数运算的几何解释,如高斯消去法。本征值和奇异值的讨论主要基于线性代数及其应用(Strang, 1988)。剪切矩阵的SVD的例子是基于计算机图形学和几何建模(Salomon, 1999)中的讨论。
用二维行列式写出通过点(x0, y0)和(x1, y1)的二维直线的隐式方程。
证明如果一个矩阵的列是标准正交的,那么行也是标准正交的。
证明式(5.5)-式(5.7)所述矩阵行列式的性质。
证明对角矩阵的特征值是它的对角元素。
证明对于方阵a, AAT是一个对称矩阵。
证明对于三个三维向量a, b, c,下列恒等式成立:|abc| = (a × b)·c。
解释为什么带边向量a, b, c的四面体的体积是由|abc|/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满足式(5.14),v是Q的第i行,λ是D对角线上的第i项,则v是A的特征值λ的特征向量。
证明如果A, Q, D满足式(5.14),A的特征值都是不同的,v是A的特征值λ的特征向量,那么对于某i, v是Q的第i行,λ是D对角线上的第i项。
给出一个二维三角形的三个顶点的(x, y)坐标,解释为什么这个面积是由