Real-Time-Rendering 矩陣(一)

        接下來就是矩陣了。圖形學中矩陣作爲最常用的工具涉及的知識點也非常多。本文以《3D圖形基礎:圖形與遊戲開發》及《Real-Time-Rendering》書中對矩陣的知識點的講述爲基礎,先做一篇矩陣概述即基礎知識。

一、矩陣的數學定義

        矩陣一般用來描述兩個座標系統間的關係。通過定義一種運算將一個座標系中的向量轉換到另一個座標系中。

        行數和列數相同的矩陣稱爲方陣。而本文即後續主要討論4x4一下的方陣。

        方陣的對角線元素即元素的行號和列號相同的元素。其他元素爲非對角線元素。如果所有非對角線元素都爲0,則該矩陣稱爲對角矩陣。如:

\begin{bmatrix} 1 & 0 & 0\\ 0 & 5 & 0\\ 0 & 0 & 6 \end{bmatrix}

        若一個對角矩陣的對角線元素皆爲1,稱爲單元矩陣。如:

\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix}

        矩陣的轉置即該矩陣沿矩陣的對角線翻折,或使行向量變爲列向量,列向量變爲行向量。如:

\begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} 轉置後 \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix} 轉置後爲\begin{bmatrix} 1 & 4 & 7\\ 2 & 5 & 8\\ 3 & 6 & 9 \end{bmatrix}

        矩陣的轉置的轉置爲原矩陣。任意對角矩陣轉置都與原矩陣相同。

        矩陣與標量相乘即各元素與標量相乘。

        矩陣與矩陣相乘。首先矩陣與矩陣相乘必須滿足前者的列數等於後者的行數。如3x4的矩陣乘4x6的矩陣會得到3x6的新矩陣。矩陣相乘的公式如下,簡單來說即結果矩陣中的任意元素Cij爲矩陣A中第i行元素集合與矩陣B中第j行元素集合相乘後的和。

        \mathbf{c}_i_j = \sum_{k=1}^{n}\mathbf{a}_i_k\mathbf{b}_k_j

        矩陣乘法不滿足交換律,但滿足結合律。矩陣積的轉置等同於各矩陣轉置的反序乘積。

        (\mathbf{AB})^{T} = \mathbf{B}^{T}\mathbf{A}^{T}

 

二、矩陣的幾何解釋

        “不幸的是,沒有人能告訴您矩陣像什麼——您必須自己去感受”。引用黑客帝國的一句話。下面我們去感受下矩陣是什麼。

        一般來說,方陣可以描述任何向量的線性變化。如旋轉、縮放、投影、鏡像、仿射。

        下面我們描述下向量通過矩陣的變換。

        根據向量加法可以如下拆分一個向量:

        \mathbf{v} = [x\: y\: z]^{T} = [x\: 0\: 0]^{T} + [ 0\: y\: 0]^{T} + [0\: 0\:z]^{T}

        \mathbf{v} = [x\: y\: z]^{T} = x[1\: 0\: 0]^{T} + y[ 0\: 1\: 0]^{T} + z[0\: 0\:1]^{T}

        將上式和3x3的單元矩陣與向量v相乘的運算相比較。很容易發現計算過程完全相同。

        如果我們把如上指向+x、+y、+z方向的單位向量定義爲pqr。那麼向量v就被表示成向量pqr的線性變換了。向量pqr被稱爲基向量。然而一個座標系可以用任意三個基向量定義。要求pqr不在一個平面即線性無關。已pqr構成3x3矩陣M

        \mathbf{M} = [\mathbf{p}\: \mathbf{q}\: \mathbf{r}]^{T} = \begin{bmatrix} \mathbf{p}_{x} & \mathbf{p}_{y} &\mathbf{p}_{z} \\ \mathbf{q}_{x} & \mathbf{q}_{y} & \mathbf{q}_{z}\\ \mathbf{r}_{x} &\mathbf{r}_{y} &\mathbf{r}_{z} \end{bmatrix}

        將矩陣M與向量v相乘可得

        \begin{bmatrix} \mathbf{p}_{x} & \mathbf{p}_{y} &\mathbf{p}_{z} \\ \mathbf{q}_{x} & \mathbf{q}_{y} & \mathbf{q}_{z}\\ \mathbf{r}_{x} &\mathbf{r}_{y} &\mathbf{r}_{z} \end{bmatrix}[x\: y\: z]^{T} = \begin{bmatrix} x\mathbf{p}_{x} + y\mathbf{q}_{x} + z\mathbf{r}_{x}\\ x\mathbf{p}_{y} + y\mathbf{q}_{y} + z\mathbf{r}_{y}\\ x\mathbf{p}_{z} + y\mathbf{q}_{z} + z\mathbf{r}_{z} \end{bmatrix} = x\mathbf{p} + y\mathbf{q} + z\mathbf{r}

        在闡述下列定義前,我們需要先做一個約定。通過前面的學習我們知道矩陣相乘或矩陣與向量相乘不滿足交換律。所以我們需要定義好向量表示的方法爲列向量。因此當向量與矩陣相乘時需要左乘矩陣。這與unity常規的約定一致。

        我們發現上式計算與前面計算轉換後的v一致。引申出:

        如果把矩陣的列解釋爲座標系的基向量。那麼左乘該矩陣就相當於執行了一次座標轉換。若有aM = b,我們可以說Ma轉換到b

        這樣我們就擁有一種反向構建矩陣的可能。即計算一個期望的變化(旋轉、縮放等)後的座標系的基向量。通過基向量獲取矩陣!

三、矩陣的行列式

        方陣M的行列式記作|M|。

        2x2階矩陣行列式定義:

        \left | \mathbf{M} \right | = \begin{vmatrix} m_{11} &m_{12} \\ m_{21} & m_{22} \end{vmatrix} = m_{11} m_{22} - m_{21} m_{22}

        3x3階矩陣行列式定義:

        \left | \mathbf{M} \right | = \begin{vmatrix} m_{11} &m_{12} &m_{13} \\ m_{21}& m_{22} & m_{23}\\ m_{31} & m_{32} & m_{33} \end{vmatrix} = m_{11}m_{22}m_{33} + m_{12}m_{23}m_{31} + m_{13}m_{21}m_{32} - m_{13}m_{22}m_{31} - m_{12}m_{21}m_{33} - m_{11}m_{23}m_{32}

        對於任意矩陣。我們需要先引申兩個概念:

        假設矩陣M有r行c列。\mathbf{M}^{{ij}}表示從M中除去第i行和第j列剩下的矩陣。稱其爲矩陣M的餘子式。

        對於方陣M,給定行、列元素的代數餘子式等於相應餘子式的有符號行列式。如下:

        c_{ij} = (-1)^{i+j}|\mathbf{M}^{ij}|

        通過代數餘子式引申出矩陣的行列式公式:

        首先從矩陣中任意選一行或一列,對該行或列的每個元素都乘以對應的代數餘子式。這些乘積的和就是矩陣的行列式。如下就是分別選一行,如行i。或選一列,如列j。

        |\mathbf{M}| = \sum_{j = 1}^{n}m_{ij}c_{ij} = \sum_{j = 1}^{n}(-1)^{i+j}|\mathbf{M}^{ij}|

        |\mathbf{M}| = \sum_{i = 1}^{n}m_{ij}c_{ij} = \sum_{i = 1}^{n}(-1)^{i+j}|\mathbf{M}^{ij}|

        例如我們算一個4x4矩陣的行列式。選取第一行。

        \begin{vmatrix} m_{11} & m_{12} & m_{13} & m_{14}\\ m_{21} & m_{22} & m_{23} & m_{24}\\ m_{31} & m_{32} & m_{33} & m_{34}\\ m_{41} & m_{42} & m_{43} & m_{44} \end{vmatrix} = m_{11}\begin{bmatrix} m_{22} & m_{23} & m_{24}\\ m_{32} & m_{33} & m_{34}\\ m_{42} & m_{43} & m_{44} \end{bmatrix} - m_{12}\begin{bmatrix} m_{21} & m_{23} & m_{24}\\ m_{31} & m_{33} & m_{34}\\ m_{41} & m_{43} & m_{44} \end{bmatrix}

                                                +m_{13}\begin{bmatrix} m_{21} & m_{22} & m_{24}\\ m_{31} & m_{32} & m_{34}\\ m_{41} & m_{42} & m_{44} \end{bmatrix} - m_{14}\begin{bmatrix} m_{21} & m_{22} & m_{23}\\ m_{31} & m_{32} & m_{33}\\ m_{41} & m_{42} & m_{43} \end{bmatrix}

        再將3x3矩陣行列的運算公式帶入即可。

        顯然高階行列式計算的複雜度呈指數遞增。我們可以使用“主元選擇的計算方式”來優化對於高階矩陣行列式計算的效率。

        行列式有以下重要性質:

        1.矩陣積的 行列式等於矩陣行列式的積。

        2.矩陣轉置的行列式等於原矩陣行列式。

        3.矩陣任意行或列全爲0,則行列式爲0,。

        4.交換矩陣的任意兩行或兩列,行列式變負。

        5.任意行或列的非零積加到另一行或列不會改變行列式的值。

四、矩陣的逆

        方陣M的逆,記作\mathbf{M}^{-1},當兩個矩陣相乘,結果爲單位矩陣。即:

        \mathbf{M}(\mathbf{M}^{-1}) = \mathbf{M}^{-1} \mathbf{M} = \mathbf{I}

        並非所有矩陣都有逆。例如一個矩陣某行或列全爲0,那麼用該矩陣乘以任意矩陣都會得到零矩陣。我們稱該矩陣可逆或非奇異。所以區分一個矩陣是否可逆或使非奇異矩陣,只需檢測該矩陣的行列式是否爲零。

        M的標準伴隨矩陣記作“adj M”。定義爲M的所有代數餘子式矩陣的轉置矩陣。如:

        \mathbf{M} = \begin{bmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{bmatrix}

        分別計算M的代數餘子式:

        c_{11} = +\begin{bmatrix} 5 & 6\\ 8 & 9 \end{bmatrix} = -3      c_{12} = +\begin{bmatrix} 4 & 6\\ 7 & 9 \end{bmatrix} = -6      c_{13} = +\begin{bmatrix} 4 & 5\\ 7 & 8 \end{bmatrix} = -3

        c_{21} = +\begin{bmatrix} 2 & 3\\ 8 & 9 \end{bmatrix} = -6      c_{22} = +\begin{bmatrix} 1 & 3\\ 7 & 9 \end{bmatrix} = -12    c_{23} = +\begin{bmatrix} 1 & 2\\ 7 & 8 \end{bmatrix} = -6

        c_{31} = +\begin{bmatrix} 2 & 3\\ 5 & 6 \end{bmatrix} = -3      c_{32} = +\begin{bmatrix} 1 & 3\\ 4 & 5 \end{bmatrix} = -7      c_{33} = +\begin{bmatrix} 1 & 2\\ 4 & 5 \end{bmatrix} = -3

        可得到M的 伴隨矩陣

        adj\mathbf{M} = \begin{bmatrix} c_{11} & c_{12} & c_{13}\\ c_{21} & c_{22} & c_{23}\\ c_{31} & c_{32} & c_{33} \end{bmatrix}^{T} = \begin{bmatrix} -3 & -6 & -3\\ -6 & -12 & -6\\ -3 & -7 & -3 \end{bmatrix}^{T}

        矩陣的逆爲矩陣M的伴隨矩陣除以M的行列式,即:

        \mathbf{M}^{-1} = adj\mathbf{M}/|\mathbf{M}|

        同樣矩陣的逆的計算也可以通過高斯消元法等來計算從而節省計算量。但使用標準伴隨矩陣可以提供無分支實現。非常適合GPU這樣的並行能力強分支計算效率低的硬件。所以在不同情境結合矩陣的大小及特殊性選擇計算方式纔是最優解。

        矩陣的逆同樣有一些重要的性質:

        1.如果M是非奇異矩陣,則該矩陣的逆的逆等於原矩陣。

        2.單位矩陣的逆等於它本身。

        3.矩陣轉置的逆等於其的逆的轉置。

        4.矩陣乘積的逆等於矩陣的逆的相反順序的乘積。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章