A.3 Matrices(矩阵)
这一节主要讲述关于矩阵的定义,以及一些常用的矩阵运算。尽管在附录中(主要)讨论任意大小的矩阵,但是在本书的正文章节中将会使用 2×2 , 3×3 以及 4×4 的方阵。在第4章讲解了使用矩阵处理变换操作的方法。
A.3.1 Definition and Operrations(矩阵的定义及操作)
一个矩阵
M
可以作为一种工具,用于操作向量和坐标点。可以使用
p×q
个标量(也可以是复数,但是复数矩阵不在本书讨论范围内)描述矩阵
M
,其中每一个标量
mij,0≤i≤p−1,0≤j≤q−1
,如公式A.22所示,以一种矩阵样式进行排列(包含
p
行和
其中记号 [mij] 将会用于本节后面的公式中,仅仅是作为描述矩阵的简单表示方式。在矩阵定义中有一种特殊的矩阵,称为 unit matrix(单位矩阵),使用记号 I 表示,这是一种主对角线上的元素都为1,其余元素全为0的方阵。也称为 identity matrix。公式A.23显示了单位矩阵的常见形式,这是标量数 1 对应的矩阵形式:
接下来,我们一起回顾关于矩阵最常用的操作运算
Matrix-Matrix Addition(矩阵加法)
矩阵加法通常只针对两个相同大小的矩阵进行相加,比如矩阵
M
和矩阵
N
的加法可以定义为
与向量加法一样,矩阵加法也是逐个元素对应的相加。相加的结果矩阵大小与执行加法的两个矩阵大小一样。以下的加法运算规则同样适用于矩阵加法:
这些法则很容易进行证明。注意其中的 0 表示所有元素都为0的矩阵。
Scalar-Matrix Multiplication(标量矩阵乘法)
标量
a
和矩阵
Transpose of a Matrix(转置矩阵)
矩阵
M=[mij]
的转置矩阵记作
MT
,并定义为
MT=[mji]
,即矩阵的列变为矩阵的行,行变成列。矩阵的转置运算,具有以下性质:
Trace of a Matrix(矩阵的迹)
矩阵的迹,使用
tr(M)
表示,即一个方阵的主对角线元素的总和,计算公式如下所示:
Matrix-Matrix Multiplication(矩阵乘法)
矩阵
M
和
N
的乘积表示为
MN
,只有矩阵
M
的大小为
p×q
并且
N
的大小为
q×r
(即
M
的行数等于
N
的列数)时才有意义,在这种情况下相乘的结果矩阵为
T
,大小为
p×r
。从数学意义上讲,矩阵乘法运算的过程如下所示:
换句话说,也就是对矩阵 M 的每一行与矩阵 N 的每一列执行叉积运算,并把结果存放到相应的行和列元素中。矩阵 T 中每一个元素的计算公式为 tij=∑q−1k=0mi,knk,j ,还可以简单表示为 tij=mi,⋅n,j ,即使用点积运算以及第一章1.2.1节的矩阵-向量索引方法。另外需要注意的是,一个 n×1 的矩阵 S=(s00 s10 ⋯ sn−1,0)T ,本质上是一个 n 元组。在使用这种表示方式的情况下,可以由矩阵与矩阵的乘法推导出矩阵-向量乘法,比如矩阵
矩阵乘法具有以下三个准则:
如果执行乘法运算的两个矩阵具有相同的阶数大小,一般情况下 MN≠NM 。也就是说除了个别特殊的矩阵,一般矩阵乘法运算不满足交换律。
Determinant of a Matrix(矩阵行列式)
只有方阵才有行列式的定义,而且一般情况下,是通过递归的形式或排列组合的方式进行定义。在本书中,我们重点讨论 2×2 和 3×3 的矩阵的行列式,因为这两种矩阵的行列式是计算机图形学中最常用的。
矩阵
M
的行列式记为
|M|
,二阶和三阶方阵的行列式分别如公式A.28和A.29所示:
在这两个公式中,可以区分一种特定的模式:该公式中符号为正的计算项是由沿对角线从上到右的元素的乘积,而负的计算项则由沿对角线从上到左的元素的乘积,如果对角线穿过了某条边就继续指向另一边的元素。此外,如果矩阵 M 的最上面的一行被替换为 exeyez ,中间行替换为 uxuyuz ,最下面一行被替换为 vxvyvz ,根据Sarrus’s scheme可以得到向量 u 和向量 v 的叉积(见A.2节叉积运算)。
另一种计算
3×3
矩阵行列式的方法是使用公式A.30所示的点积和叉积运算,这种方法使我想起了在第一章1.2.1节介绍的列向量索引方法:
另外,矩阵的行列式还可以使用以下记号表示:
另外,矩阵的行列式还可以使用以下记号表示:
另外可以看出公式A.18中的标量三重积可以用于公式A.30中,也就是说,如果只是对这些向量轮换执行点积和叉积运算,则不会改变矩阵的行列式,但是如果改变向量的轮换顺序就会改变行列式的符号。
如果矩阵
M
为
n
阶方阵,那么矩阵行列式的计算具有以下性质:
另外,如果某一行(或一列)的所有元素与一个标量 a 相乘,那么得到的行列为
通过行列式可以确定一个向量基的方向。如果行列式为正值,则称该基构成了一个右手坐标系,也称为正向基。标准基就是一种正向基,因为行列式 |exeyez|=(ex×ey)⋅ez=(0,0,1)⋅ez=ez⋅ez=1>0 。如果行列式为负值,就称该向基为负向基或者说形成了一个左手坐标系。
在A.5节我们将会讨论行列式的一些几何意义。
Adjoints(伴随矩阵)
伴随矩阵是矩阵的另一种形式,在有些情况下非常有用。特别是在第4章4.1.7节使用伴随矩阵对表面的法向量执行变换运算。另外,伴随矩阵是计算矩阵的逆的第一步。首先,我们定义一个
n×n
矩阵
M
(
n
阶方阵) 的子行列式(也称为代数余子式)
由此可以得到一个 3×3 矩阵的伴随矩阵为:
为了简单起见,我们没有写出余子式的上标 M 。另外需要注意的是余子式的符号与余子式出现的顺序之间的关系。如果要计算任意大小的矩阵 M 的伴随矩阵 A ,在 (i,j) 处对应的余子式分量为:
Inverse of a Matrix(矩阵的逆)
在本书中矩阵 M 的乘法逆矩阵记为 M−1 ,只有行列式 |M|≠0 的方阵才存在逆矩阵。如果当前矩阵的全部元素标量值为实数,那么该矩阵满足条件 MN=I 以及 NM=I ,并且 N=M−1 。矩阵的逆还可以这样描述:如果在 u=Mv 的情况下,存在一个矩阵 N 使得 v=Mu ,则有 N=M−1 。
根据不同的情况可以隐式或显式的计算矩阵的逆。如果逆矩阵需要在多处使用,最好是显式计算 M−1 ,即使用一个包含 n×n 个实数值组成的数组表示逆矩阵。另一方面,如果只是要求解(向量 v 的)一种 u=Mv 类型的线性方程,则使用一种隐式方式更合适,比如Cramer’s rule(克莱姆法则)。对于 Mv=0 类型的线性方程,只有要矩阵的行列式 |M|=0 的情况下,才有方向解向量 v 。
使用克莱姆法则求解
u=Mv
可以得到
v=M−1u
,但不会显式求出
M−1
。公式A.35中显示了
v
的常用求解方法:
其中第 di 项类似于计算矩阵行列式 |M| ,除了需要把第 i 列替换为向量
对该公式中的许多项都可以使用标量三重积准则进行因式分解,然后重新以加快计算速度。比如,在第16章的16.8节使用了这种方法计算射线与三角形平面的交点。
对于一个
2×2
大小的矩阵,显式计算矩阵的逆的方法如公式A.37所示,可以看出,这是种方法非常容易实现,因为
|M|=m00m11−m01m10
:
对于一般的矩阵,可以使用上一节所讲的伴随矩阵表示矩阵的逆:
实际上,这是使用克莱姆法则显式计算逆矩阵的不同的表示方式。
但是对于大小大于
4×4
的矩阵,没有简单的公式可用,也无法再使用克莱姆法则。对于这种矩阵,一种较好的方法是高斯消元法,可以用于求解
u=Mv⇒v=M−1u
,这是一种隐式的求解方法,正如使用克莱姆法则的情况一样。然而,高斯消元法也可以用于显式计算矩阵的逆
M−1
。考虑如公式A.39所示的方程,其中
u
和
v
是与矩阵
M
和
I
(单位矩阵)具有相同维数的任意向量:
对此等式两边不断的执行高斯消元法,直接矩阵 M 被转换成单位矩阵 I ,此时等式右边的单位矩阵就变成了逆矩阵 M−1 。因此,向量 u 和 v 实际上没有任何特殊的用途,仅仅是用于表示公式A.39的一种数学方式。
另一种用于计算逆矩阵的比较高效的方法是LU分解。但是,关于高斯消元法和LU分解法并不在本书的讨论范围内。几乎任何关于线性代数或数值方法论的书籍,都会讲解这些计算逆矩阵的方法。
矩阵的逆运算具有以下性质:
Eigenvalue and Eigenvector Computation(特征值与特征向量的计算)
矩阵特征值的求解具有非常广泛的用途。例如,其中一种应用领域是计算tight bounding volumes(紧贴的包围盒,见第17章17.4节)。矩阵的特征值描述如下:
其中 λ 是一个标量。矩阵 A 必须为方阵(大小为 n×n ),并且 x≠0 ,那么称满足方向式的向量 x 为矩阵 A 的特征向量,对应的 λ 称为特征值。把A.40等式的两边重新分配可以得到公式A.41:
注:在这时使用记号 λ 表示特征值(尽管这不符合我们之前定义的标量表示记号),因为这是大多数书籍的表示方式。
当且仅当 pA(λ)=det(λI−A)=0 时该方程式有解,其中 pA(λ) 称为 A 的特征多项式。而特征向量 λ0,⋯,λn−1 就是方程 pA(λ)=0 的解。我们重点讨论一下矩阵 A 的某个特定的特征值 λi 。对于 λi ,如果存在 xi 满足 (λiI−A)xi=0 ,则 xi 为对应的特征向量,也就是说一旦得到矩阵的特征值,就可以通过高斯消元法求解对应的特征向量。
矩阵的特征值与特征向量具有以下定理性质:
Orthogonal Matrices(正交矩阵)
这一节我们主要阐明正交矩阵的概念,以及相关的性质和特征。一个元素全部为实数的方阵 M ,有且仅有满足 MMT=MTM=I 时才是正交矩阵。即正交矩阵与它的转置相乘得到一个单位矩阵。
正交矩阵具有以下重要性质:
标准基构成了标准正交基,因为基向量是相互正交的并且向量长度都为1。把标准基当作一个矩阵,那么该矩阵就是正交矩阵: E=(ex ey ez)=I ,并且 ITI=I 。
注:该向量基构成了标准正交基,但是表示的矩阵只是一般的正交矩阵。
对于标准基和正交矩阵需要消除一些可能存在的混淆,一个正交矩阵一个组正交的向量集合(基)并不相同。非正式的说就是正交矩阵必须由规范化的向量组成。一组向量可能是互相垂直的,因此也称为正交向量集。但是,如果把这些向量作为行或列插入到一个矩阵之前,没有对基进行规范化,那么就不会使插入之后的矩阵变成正交矩阵。另一方面,对于一组标准正交向量集(基),如果把向量作为行或列插入到矩阵中,由此形成的矩阵问题正交矩阵。使用术语标准正交矩阵表示正交矩阵从逻辑上讲更贴切,因为正交矩阵总是由标准正交基组成,但是数学术语并不总是按照逻辑定义的。
A.3.2 Change of Base(基变更)
假设有一个向量
v
位于标准基中(见1.2.1节),使用坐标轴
ex
,
ey
和
ez
表示。另外,还有一个使用任意的基向量
fx
,
fy
和
fz
(这三个向量不能位于同一个平面中,即
|fx fy fz|≠0
)组成的坐标系。那么如何使用
fx
,
fy
和
fz
组成的向量基唯一的表示向量
v
?可以使用以下的公式求解,其中向量
w
就是在
F
组成的向量基中向量
v
的唯一表示:
如果矩阵
F
为正交矩阵,即矩阵的逆可以简单的由
F−1=FT
得到,此时会产生如下的特殊情况,公式A.42可以简化为公式A.43:
正交坐标系的变更是计算机图形学领域最常用的一种坐标系变更方式。
A.4 Homogeneous Notation(齐次记号表示)
这一节可以说是本章最重要的部分,因为这部分内容影响到计算机图形学的多个领域,但是几乎没有一本常见的线性代数书籍中讨论了这些内容。
点表示空间中的一个具体位置,向量表示一个没有具体位置的方向。使用 3×3 的矩阵(或者在二维空间中使用 2×2 矩阵)可以在坐标空间中执行一些线性变换,如旋转,缩放以及切变。但是,这种大小的矩阵无法用于执行平移变换。对于向量的变换来说这是无关紧要的,因为向量不存在平移变换,但是坐标点需要平移操作。
齐次记号表示法对于向量和坐标点都是非常有用的,并且这种方法能够只针对坐标点执行平移运算。齐次法把 3×3 矩阵扩展为 4×4 大小的矩阵,并把三维的坐标点和向量增加一个元素分量。因此一个齐次向量表示为 p=(px,py,pz,pw) 。并且对于坐标点,分量 pw=1 ,对于向量 pw=0 ,很快就会验证这一点。对于投影变换, pw 还可以使用其他的值(见第4章4.6节)。当 pw≠0 并且 pw≠1 时,真实的坐标点是通过齐次化操作得到的,此时每一个分量都要除以 pw 。也就是说得到了坐标点 (px/pw,py/pw,pz/pw,1) 。
如下公式A.44所示,一个
3×3
的矩阵
M
(以最简单的方法)扩展到矩阵的齐次形式为:
使用旋转,缩放和切变矩阵替换该公式中的矩阵 M ,就可以对向量和坐标点执行相应的变换操作。然而,平移变换则是使用经过齐次扩展后的矩阵中新增的元素,达到平移操作的目的。一个典型的平移矩阵 m 如公式A.45所示,该矩阵通过一个向量 t 对一个坐标点执行平移操作:
在平移变换之后再执行一种线性变换的组合称为 affine transform(仿射变换)。
从该平移矩阵可以看出, Tv 变换不会影响到向量 v=(vx,vy,vz,0) ,因为向量的最后一个分量元素为0。而对于坐标点 p=(px,py,pz,1) 执行 Tp 变换,运算的结果为 (px+tx,py+ty,pz+tz,1) ,即使用向量 t 平移 p 。
通过矩阵与矩阵相乘(得到各个齐次变换矩阵的串接矩阵),以及矩阵与向量相乘可以得到与非齐次情况下同样的结果。在第4章,将会详细讨论并分析各种不同的齐次变换操作。