矩阵
由 m m m 行n n n 列实数组成的矩形阵列称作规模为 m × n m\times n m × n 的矩阵 (matrix)M \boldsymbol{M} M 。矩阵中的数字称作元素(element)或元(entry)。用M i j \boldsymbol{M}_{ij} M i j 表示矩阵中第 i i i 行、第 j j j 列的元素。
矩阵乘法
m × n m\times n m × n 的矩阵 A \boldsymbol{A} A 与n × p n\times p n × p 的矩阵 B \boldsymbol{B} B 的乘积为规模 m × p m\times p m × p 的矩阵 C \boldsymbol{C} C 。C \boldsymbol{C} C 中第 i i i 行、第 j j j 列的元素为矩阵 A \boldsymbol{A} A 第i i i 个行向量与矩阵 B \boldsymbol{B} B 第j j j 个列向量的点积,即:
C i j = A i , ∗ ⋅ B ∗ , j \boldsymbol{C}_{ij}=\boldsymbol{A}_{i,*}\cdot\boldsymbol{B}_{*,j}
C i j = A i , ∗ ⋅ B ∗ , j
向量与矩阵的乘法
向量 u = ( x , y , z ) \boldsymbol{u}=(x,y,z) u = ( x , y , z ) 与矩阵 A \boldsymbol{A} A 的乘法:
u A = x A 1 , ∗ + y A 2 , ∗ + z A 3 , ∗ \boldsymbol{uA}=x\boldsymbol{A}_{1,*}+y\boldsymbol{A}_{2,*}+z\boldsymbol{A}_{3,*}
u A = x A 1 , ∗ + y A 2 , ∗ + z A 3 , ∗
实为一种 线性组合 (linear combination),意味着向量与矩阵的乘积u A \boldsymbol{uA} u A 相当于:向量 u \boldsymbol{u} u 的标量系数 x x x 、y y y 、z z z 与矩阵 A \boldsymbol{A} A 各行向量的线性组合。
转置矩阵
转置矩阵 (transpose matrix)指的是将原矩阵M \boldsymbol{M} M 的行和列互换所得到的新矩阵,记作M T \boldsymbol{M}^\boldsymbol{T} M T 。
单位矩阵
单位矩阵 (identity matrix)是一种主对角线上元素均为 1,其他元素都为 0 的方阵。
行列式
行列式 (determinant)是一种特殊的函数,以一个方阵作为输入,并输出实数。通常记作d e t A det \boldsymbol{A} d e t A 。定义为:
d e t A 11 = A 11 d e t A = ∑ j = 1 n A 1 j ( − 1 ) 1 + j d e t A ‾ 1 j ( n > 1 ) \begin{aligned}
det \boldsymbol{A}_{11} &= \boldsymbol{A}_{11} \\
det \boldsymbol{A} &=\sum_{j=1}^n\boldsymbol{A}_{1j}(-1)^{1+j}det\boldsymbol{\overline{A}}_{1j} & (n>1)
\end{aligned}
d e t A 1 1 d e t A = A 1 1 = j = 1 ∑ n A 1 j ( − 1 ) 1 + j d e t A 1 j ( n > 1 )
其中 A ‾ i j \boldsymbol{\overline{A}}_{ij} A i j 为A \boldsymbol{A} A 的 余子阵 (minor martix),即为A \boldsymbol{A} A 中去除第 i i i 行、第 j j j 列的 ( n − 1 ) × ( n − 1 ) (n-1)\times(n-1) ( n − 1 ) × ( n − 1 ) 的矩阵。
伴随矩阵
设 A \boldsymbol{A} A 为n × n n\times n n × n 矩阵。乘积 C i j = ( − 1 ) i + j d e t A ‾ i j \boldsymbol{C}_{ij}=(-1)^{i+j}det\boldsymbol{\overline{A}}_{ij} C i j = ( − 1 ) i + j d e t A i j 称为 元素 A i j \boldsymbol{A}_{ij} A i j 的代数余子式 (cofactor of A i j \boldsymbol{A}_{ij} A i j )。将C i j \boldsymbol{C}_{ij} C i j 置于矩阵 C A \boldsymbol{C}_\boldsymbol{A} C A 中第 i i i 行、第 j j j 列的相应位置,将获得 矩阵 A \boldsymbol{A} A 的代数余子式矩阵 (cofactor matrix of A \boldsymbol{A} A ):
C A = [ C 11 C 12 ⋯ C 1 n C 21 C 22 ⋯ C 2 n ⋮ ⋮ ⋱ ⋮ C n 1 C n 2 ⋯ C n n ] \boldsymbol{C}_\boldsymbol{A}=
\left[\begin{array}{cccc}
C_{11} &C_{12} &\cdots &C_{1n} \\
C_{21} &C_{22} &\cdots &C_{2n} \\
\vdots &\vdots &\ddots &\vdots \\
C_{n1} &C_{n2} &\cdots &C_{nn}
\end{array}
\right]
C A = ⎣ ⎢ ⎢ ⎢ ⎡ C 1 1 C 2 1 ⋮ C n 1 C 1 2 C 2 2 ⋮ C n 2 ⋯ ⋯ ⋱ ⋯ C 1 n C 2 n ⋮ C n n ⎦ ⎥ ⎥ ⎥ ⎤
取 C A \boldsymbol{C}_\boldsymbol{A} C A 的转置矩阵,将得到 矩阵 A \boldsymbol{A} A 的伴随矩阵 (adjoint matrix of A \boldsymbol{A} A ),记作:
A ∗ = C A T \boldsymbol{A}^*=\boldsymbol{C}_\boldsymbol{A}^T
A ∗ = C A T
逆矩阵
只有方阵有逆矩阵。
n × n n\times n n × n 矩阵 M \boldsymbol{M} M 的逆也为 n × n n\times n n × n 矩阵,表示为M − 1 \boldsymbol{M}^{-1} M − 1 。
存在逆矩阵的方阵称为 可逆矩阵 (invertible matrix),不存在逆矩阵的方阵称为 奇异矩阵 (singular matrix)。
可逆矩阵的逆矩阵唯一。
矩阵与它的逆矩阵相乘得到单位矩阵。
求逆矩阵公式:
A − 1 = A ∗ d e t A \boldsymbol{A}^{-1}=\frac{\boldsymbol{A}^*}{det\boldsymbol{A}}
A − 1 = d e t A A ∗
由于我们关注的 3D 计算机图形学中所涉及的具有特殊形式的矩阵,因此提前确定出了他们的求逆矩阵公式。这样一来,上式在代码中极少被运用。
矩阵乘积的逆有如下性质:
( A B ) − 1 = B − 1 A − 1 (\boldsymbol{A}\boldsymbol{B})^{-1}=\boldsymbol{B}^{-1}\boldsymbol{A}^{-1}
( A B ) − 1 = B − 1 A − 1
DirectXMath 库
矩阵类型
DirectXMath 中定义 XMMATRIX 类来表示 4 × 4 4\times 4 4 × 4 矩阵。XMMATRIX由 4 个 XMVECTOR 实例构成,借此使用 SIMD 技术。
XMMATRIX实列可以通过:
4 个行向量
16 个矩阵元素
含有 16 个浮点数元素的数组
来进行初始化。
DirectXMath 文档建议使用 XMFLOAT4X4 来存储类中的矩阵类型数据成员变量,并由以下加载和存储方法:
1 2 3 4 inline XMMATRIX XM_CALLCONV XMLoadFloat4x4 (const XMFLOAT4X4 *pSource) ;inline void XM_CALLCONV XMStoreFloat4x4 (XMFLOAT4X4 *pDestination, FXMMATRIX M) ;
矩阵函数
1 2 3 4 5 6 7 8 9 10 11 12 XMMATRIX XM_CALLCONV XMMatrixIdentity () ;bool XM_CALLCONV XMMatrixIsIdentity (FXMMATRIX M) ;XMMATRIX XM_CALLCONV XMMatrixMultiply (FXMMATRIX A, CXMMATRIX B) ;XMMATRIX XM_CALLCONV XMMatrixTranspose (FXMMATRIX M) ;XMVECTOR XM_CALLCONV XMMatrixDeterminant (FXMMATRIX M) ;XMMATRIX XM_CALLCONV XMMatrixInverse (XMVECTOR* pDeterminant, FXMMATRIX M) ;
32 位 Windows 上的调用约定:
1 2 3 4 5 6 7 typedef const XMMATRIX& FXMMATRIX;typedef const XMMATRIX& CXMMATRIX;typedef const XMMATRIX FXMMATRIX;typedef const XMMATRIX& CXMMATRIX;
32 位 Windows 上的 __fastcall 调用约定中,XMMATRIX是不能传至 SSE/SSE2 寄存器的,因为寄存器这时只支持 3 个 XMVECTOR 参数传入,XMMATRIX由 4 个 XMVECTOR 构成,只能通过堆栈来引用。
构造函数是一个特例,DirectXMath 建议用户总是在构造函数中采用 CXMMATRIX 类型来获取 XMMATRIX 参数,也不要使用 XM_CALLCONV 约定注解。