矩阵(matrix)是图形学程序中最常用的工具,它可以对点和向量进行变换(transform)。本章将从几何视角回顾基础的线性代数,主要关注几何直觉和算法,这些内容对二维、三维情形都适用。
行列式(determinant)
根据线性代数的基础知识,行列式具有以下基本性质:
- ∣A∣=∣AT∣,其中 AT 是 A 的转置;
- ∣a1⋯(kai)⋯an∣=k∣a1⋯ai⋯an∣,其中 k 是任意常数;
- ∣a1⋯ai⋯aj⋯an∣=−∣a1⋯aj⋯ai⋯an∣;
- ∣a1⋯(ai+b)⋯an∣=∣a1⋯ai⋯an∣+∣a1⋯b⋯an∣,其中 b 是任意 n 维列向量;
- ∣a1⋯(ai+kaj)⋯an∣=∣a1⋯ai⋯an∣。
在几何上,行列式可以看作平行四边形(parallelogram)的有向面积(signed area)或者平行六面体(parallelepiped)的有向体积(signed volume)在任意维度的推广。平行四边形和平行六面体在任意维度的推广称为超平行体(parallelotope)。n 维超平行体可以表示为:{ p∈Rn ∣ p=∑i=1ntiai, 0⩽t1,⋯,tn⩽1 },a1、a2、…、an 是超平行体的棱向量。把上面的行列式基本性质和施密特正交化(Schmidt orthogonalization)结合起来可知,n 维超平行体的体积正是行列式 ∣a1a2⋯an∣ 的绝对值,因此行列式确实可以作为超平行体的有向体积;“体积正比于边长” 和 “切变不改变体积” 这两条性质,反映在行列式性质 2 和 5 中;而克拉默法则(Cramer's rule)也在一定程度上体现了 “切变不改变体积” 这一性质。
i=1∑nxiai=[a1,a2,⋯,an]x=y⇒xi∣a1⋯ai⋯an∣=∣a1⋯(xiai)⋯an∣=∣a1⋯i=1∑n(xiai)⋯an∣=∣a1⋯y⋯an∣⇒xi=∣a1⋯ai⋯an∣∣a1⋯y⋯an∣
二维、三维中有向体积的正负与棱向量组的手性(chirality)有关;如果棱向量组构成右手螺旋,则有向体积为正,反之为负。

由于矩阵就是线性变换,因此行列式还可以理解为线性变换对体积的影响,雅可比行列式(Jacobian)就是一个很好的例子。
关于行列式的具体内容可以参考线性代数教材。
矩阵(matrix)
矩阵有数乘、加法、乘法运算:
kA=k(aij)r×cdef(kaij)r×cA+B=(aij)r×c+(bij)r×cdef(aij+bij)r×cAB=(aij)r×m(bij)m×cdef(l=1∑mailblj)r×c
矩阵乘法一般不满足交换律(commutative law)和消去律(cancellation law):
AB=BAAB=AC ⇏ B=C
但满足结合律(associative law)和分配率(distributive law):
(AB)C=A(BC)A(B+C)=AB+AC(A+B)C=AC+BC
单位矩阵(identity matrix)I:
Idef(δij)n×n其中,δij={1, i=j0, i=j
方阵 A 的逆矩阵(inverse matrix)A−1:
AA−1=A−1A=I
乘积矩阵的逆:
(AB)−1=B−1A−1
矩阵 A 的转置(transpose)AT:
AT=(aij′)c×raij′defaji
乘积矩阵的转置:
(AB)T=BTAT
矩阵的行列式满足:
∣AB∣=∣A∣∣B∣A−1=∣A∣1AT=∣A∣
向量也可以用矩阵来表示,现今最常用的方式是用 n×1 矩阵表示 n 维向量,这也称为列向量(column vector);而向量的线性变换可以用方阵左乘来表示。
也可以用方阵右乘表示线性变换,此时向量需用 1×n 矩阵来表示,这称为行向量(row vector)。这两种表示之间的区别仅在于方阵互为转置,但方阵右乘的这种表示现今已不常用。
向量点乘的矩阵形式:
aTb
向量的张量积(outer product)的矩阵形式:
abT=(aibj)n×n
向量的张量积也称为并矢(dyad)。
由于分块(partitioning)不影响矩阵乘积的结果,因此矩阵乘法有多种理解方式。下面是方阵左乘列向量的两种最常见的理解方式:
y=Ax=r1 Tr2 T⋮rn Tx=r1⋅xr2⋅x⋮rn⋅x=[c1c2⋯cn]x1x2⋮xn=i=1∑nxici
同阶方阵相乘也有很多种理解方式:
AB=r1Ar2A⋮rnA[c1Bc2B⋯cnB]=(riAcjB)n×n=A[c1Bc2B⋯cnB]=[Ac1BAc2B⋯AcnB]=r1Ar2A⋮rnAB=r1ABr2AB⋮rnAB=[c1Ac2A⋯cnA]r1Br2B⋮rnB=i=1∑nciAriB
这些矩阵分块的方式有助于从几何视角更直观地理解矩阵运算。
对角矩阵(diagonal matrix):
Ddef(diδij)n×n
对称矩阵(symmetric matrix):
AT=A
正交矩阵(orthogonal matrix):
RTR=RRT=I
关于矩阵的详细内容可以参考线性代数教材。
计算
行列式可以理解为关于矩阵的标量函数。而行列式的几何意义则有助于建立平面的参数方程——在给定平面上三个点的条件下。计算行列式一般采用按行/列展开的方式,这实际上是拉普拉斯定理(Laplace's theorem)的一个特例:
∣A∣=i=1∑nalialic , 1⩽l⩽n
其中,alic 是 ali 的代数余子式(algebraic cofactor)。如果行列式为 0,则说明行/列向量线性相关(linearly dependent),否则线性无关(linearly independent)。
逆矩阵也可以使用行列式来计算:
A−1=∣A∣1A∗
伴随矩阵(adjoint matrix):
A∗=(aij′)n×n , aij′defajic
用这种方法对大矩阵求逆时很低效,但是图形学中矩阵规模通常较小。
图形学中经常遇到 n 个方程、n 个未知量的线性方程组:
Ax=b
求解这一问题有很多方法,最合适的解法取决于矩阵 A 的规模和性质。图形学中通常 n⩽4,此时克拉默法则(Cramer's rule)是一种合适的方法:
xi=∣A∣∣a1⋯ai−1yai+1⋯an∣A=[a1⋯ai−1aiai+1⋯an]
原文中关于线性方程组是否有解的表述——“Note that if |A| = 0, the division is undefined and there is no solution”——有误,行列式 ∣A∣ 为 0 时,方程组仍然可以有解,甚至有无穷多解。
本征值(eigenvalue)与矩阵对角化(matrix diagonalization)
满足下面方程的非零向量 a 称为本征向量(eigenvector),λ 称为本征值(eigenvalue):
“eigenvalue” 和 “eigenvector” 也可译为特征值和特征向量。
Aa=λa
也就是说,矩阵的作用不改变本征向量的方向。
求解下面的本征多项式可以得到所有本征值:
∣λI−A∣=0
阶数较低的矩阵可以通过求根公式计算,而阶数较高的矩阵只能通过数值方法计算。
实对称矩阵(real symmetric matrix)的本征值均为实数,而且一定可以被对角化(diagonalization):
对角化也是一种相似变换。相似变换其实就是坐标系变换,即 P−1AP 是 A 在 P 的列向量基下的表示。
A=QDQT
其中,对角矩阵 D=diag(λ1,λ2,⋯,λn) 由矩阵 A 的所有本征值构成,而正交矩阵 Q 中的每一列是对应位置的本征向量。矩阵对角化也称为本征值分解(eigenvalue decomposition)。
奇异值分解
奇异值分解(singular value decomposition, 简称为 SVD)是本征值分解从对称矩阵向非对称矩阵——甚至非方阵——的一种推广:
A=USVT
其中,U、V 均为正交矩阵,且不必相等,它们的每一列被称为左、右奇异向量(singular vector),矩阵 S=diag(σ1,σ2,⋯,σn) 的对角元称为奇异值(singular value)。
根据实对称矩阵的本征值分解可以知道,对于任意实矩阵 A,均存在正交矩阵 U 使得:
AAT=UDUT⇒(UTA)(UTA)T=D
上式说明 UTA 中任意两行正交,且 D 的对角元均非负。对 UTA 中所有非零行归一化,再扩充出一组完备正交基作为每一列,从而构成正交矩阵 V,最终可以得到矩阵 A 的奇异值分解。这里已经显现出奇异值的唯一性问题,为解决这一问题,一般约定奇异值均非负。
反之,若已知矩阵 A 的奇异值分解,则有:
AAT=US2UT
即,矩阵 A 的奇异值是矩阵 AAT 本征值的算数平方根,左奇异向量是 AAT 的本征向量;同理,右奇异向量是 ATA 的本征向量。