3D圖形:矩陣的行列式,矩陣的逆、正交矩陣、齊次矩陣

發表於2016-10-22
111396375-f24094d9b10aa68c 前言

在前面我們說到關於矩陣的一些計算知識,相信大家已經覺得進入了水深火熱之中了,那麼為了讓大家感到更加刺激的視覺體驗和感官體驗,這一篇部落格,我將對矩陣的行列式,矩陣的逆,正交矩陣,齊次矩陣進行探討研究整理.我很慶幸你們看到這裡了,為什麼這麼說呢?其實呢,因為齊次矩陣是我們平常開發用的比較多的,我曾經在Core Graphics框架 :仿射變換與齊次座標簡單的提到過(小白視角),這篇我將對齊次矩陣進行進一步的說明.

那麼接下來,好戲登場了.

矩陣的行列式


在任意的一個方陣都存在這樣的一個標量,稱作該方陣的行列式.一開始如果我一頓說概念,可能到時候懵的就不單單是讀者了,連我自己都會懵逼的,我們就用實際的例子來說明行列式以及行列式的幾何意義.

線性運演算法則

首先,我們先看方陣M的行列式為 |M|,(註明:非方陣的行列式是未定義的)我們先從最簡單的2×2的方陣來說明.2×2的方陣的行列式具體的定義如下所示.

121396375-7d74e6071bb3993a

那麼這裡要注意的一點就是不能書寫行列式的時候,不能像矩陣使用方括號了,我們要使用的是兩條豎線…

根據書上所說的,我們可以這樣進行記憶計算過程,將主對角線和反對角線的元素各自相乘,然後主對角線上的積減去反對角線元素的積.如下圖所示.當然了,這是適用於2×2方陣的行列式的計算,3×3方陣的行列式計算可不是這麼簡單的,要麻煩的多得多.客官容我慢慢道來.

131396375-7111e2a8951890a4

2×2方陣的行列式的計算例子如下所示.

141396375-63554cd72d85f457

上面基本就是2×2方陣行列式的計算的所有內容了,接下來我們看3×3方陣行列式的計算.首先我們先看一下3×3方陣行列式的定義.

151396375-bba0d5444910f153

看上去是不是很麻煩?其實當我們掌握它的計算技巧之後,可以很簡單的計算出來.首先先把矩陣M連寫兩遍,接著如圖所示進行計算.

161396375-6c580f8d55085106

好了經過2×2方陣和3×3方陣的洗禮,我們逐漸懵圈了,而且方陣的難道我們就只能這樣計算行列式嗎?不不不,數學界的前輩們已經為了我們留下來寶貴的計算方式,那就是餘子式和代數餘子式,兩者的使用和不同就讓我們一睹為快吧.

首先我們先看一下餘子式.我們首先看一下概念,假設一個矩陣M,去除第i行和第j列之後剩下的矩陣就是矩陣M的餘子式(i和j的限制條件就不過多解釋說明了),記法如下所示.

171396375-c09cdb3a1657e852

接下來,我們用一個示例來做一下說明餘子式是如何生成的.

181396375-b2c437f4e6c7da44

上面我們已經對餘子式的定義和計算方法有所瞭解.那麼接下來,我們要對餘子式的相關知識來做一下說明.那麼什麼叫代數餘子式呢?

代數餘子式是這樣定義的,對於一個方陣M,給定行、列元素的代數餘子式等於對應的餘子式的有符號的行列式.我們把上面的這句定義給提煉一下,某個矩陣的代數餘子式是行列式,那麼我們已經注意到了,某個矩陣的餘子式是一個矩陣.這樣我們就知道兩者的不同之處了,一個是標量,一個是矩陣,這就是兩者的不同之處.好了,瞭解完兩者的不同之處之後,我們來看代數餘子式的計算方法是怎麼定義的,如下所示.

191396375-f2ccf58e5260c52f

只有上面的公式讓我們感到很無助不是,那麼接下來我們用一個接著餘子式的示例來求解對應的代數餘子式.如下所示.

201396375-bbd0fb8be5c036dc

那麼說了這麼多餘子式和代數餘子式的知識,到底對我們的行列式的求解有什麼幫助呢?其實,我們是可以利用餘子式和代數餘子式直接計算任意n維方陣的行列式,首先,我們找到矩陣的任意一行i(i不大於最大行數),然後,列數j依次增加.具體的計算公式如下所示.

211396375-8aebfa6e3657634b

那麼有了公式之後避免不了就是驗證,接下來我們就用公式來推導4×4方陣的行列式.由於有了計算公式的便利,我們計算起來就比較方便了,但是我們要仔細判斷每一個項的正負(自己驗證的時候沒注意,驗證出錯兩三遍).這裡,我選擇的i =1(自己驗證的時候可自行選擇i) ,具體的驗證過程如下所示.(由於其中的項過多,所以分兩步截圖.)

221396375-8f1e790bfdc56dee
計算的第一步
231396375-c4ca36795819499f
計算的結果

通過上面我們發現,行數列數越多的方陣行列式的複雜度就會越高.複雜度會呈指數增長.我們計算到4×4的就已經非常的麻煩了(其實4×4的行列式我們已經夠用了),那麼要是在來個10×10的方陣行列式,我們豈不要瘋掉?這裡,書中提到了一種行列式的計算方式叫做”主元選擇”的計算方式,感興趣的小夥伴可自行查詢資料.

上面我們已經說完了行列式,但是說了一大堆,我們還是懵圈的,那麼行列式是用來幹什麼的呢?或者說是行列式代表著什麼意義呢?其實,在2D中行列式代表著以基向量為兩邊的平行四邊形的有符號面積.在3D環境中則代表著以基向量為三邊的平行六面體有符號體積.我們看以下示例來驗證我們的想法.

如圖所示,在2D環境中有基向量v = [3 0] ,u = [1 2].

241396375-4aa891cf00fda769

那麼它的面積是3×2 = 6,它的行列式是3×2-1×0 = 6,我們發現行列式是和麵積相等的(當然了,如果基向量v = [-3 0] ,行列式最終計算出來的值為-6)

接下來,我們看一下在3D環境中的有三個基向量u = [2 0 0],v = [1 2 0],w= [0 0 1],如圖所示.

251396375-8a179451e6477c52

然後我們計算由上面三個基向量所圍成的正六面體的體積為1x2x2 = 4,計算的三個基向量所組成的矩陣的行列式.發現兩者的絕對值是相等的.如下所示.

261396375-1d916c5189e388de
 271396375-3c80e1d065fe4d83

矩陣的逆


矩陣的逆和矩陣的轉置是有所不同的,矩陣的轉置請檢視3D圖形:矩陣的相關知識.求逆運算有個先決條件,那就是隻有方陣才可以進行求逆運算.

首先我們看一下方陣的逆是如何定義的.假設一個方陣M,方陣M的逆,記作M^-1,方陣的逆也是一個矩陣.當MM^-1相乘的時候,結果是單位矩陣I.如下所示.

281396375-e87cf4920f5e32e3

那麼我該如何計算方陣M的逆呢?在我看的3D圖形上是給出瞭如下的方法.

291396375-48ea27aabe726ab6

在上面的公式中矩陣的行列式我們知道如何求解,那麼adj M是什麼鬼?adj M叫做矩陣M的伴隨矩陣,定義為矩陣M的代數餘子式矩陣的轉置矩陣(挺繞口).沒事,我們看一下示例是如何解釋的這個的.假設矩陣M如下所示.

301396375-4f1bf9b9f6aa1023

那麼接下來,我們把矩陣中所有的元素的代數餘子式求解出來,如下所示.

311396375-297da67c2f41477e

那麼代數餘子式的轉置矩陣(adjM)如下所示.

321396375-cfb4e34fd88b2316

代數餘子式的轉置矩陣(adjM),我們已經求解出來了,接下來,我們就要求解矩陣的逆了.套用公式計算過程如下所示.

331396375-93e2742348c5fa5c

上面我們知道了矩陣的逆的概念和計算方法,那麼它的實際作用是什麼呢?或者說是它的幾何意義是什麼呢?其實矩陣的逆主要適用於”撤銷”功能的實現.比如一個向量ν通過矩陣M進行了變換,然後呢,我們可以再呈上M的逆矩陣,這樣就撤銷了變換動作了,驗證過程如下所示.

341396375-4343f52077f3c7b3

正交矩陣


先來看一下正交矩陣是如何定義的,若方陣M是正交的,則當且僅當M與他的轉置矩陣M^T的乘積等於單位矩陣,那麼就稱矩陣M為正交矩陣.

351396375-993e98e9f5610cf7

在矩陣的逆中我們知道,矩陣的逆和矩陣的乘積為單位矩陣I,由此推理,我們可以知道,如果該矩陣為正交矩陣,那麼矩陣的逆和轉置矩陣是相等的.

361396375-c4a850e12f3fa2c4

那麼正交矩陣存在的意義是什麼呢?其實如果一個矩陣是正交矩陣,那麼矩陣的逆和轉置矩陣是相等的.轉置矩陣是非常簡單計算的,而計算矩陣的逆如果使用代數餘子式計算是非常的麻煩,所以我們可以直接計算轉置矩陣然後直接得到該矩陣的逆.

4X4齊次矩陣


DuangDuangduang~本文的最重要的部分–齊次矩陣,在說其相關內容之前,我們要先用兩個比較經典的示例來說一下齊次空間是如何出現的,(範例是從網上尋找到,莫怪)

兩條平行線會相交嗎?
在沒有認識到齊次空間之前,我們知道兩條平行線是不能相交的,但是兩條平行線真的不能相交嗎?我們看下面這幅圖,我們都知道兩條鐵軌是平行的,但是這兩條平行的鐵軌在無窮遠處會相交於一點.這對嗎?在笛卡爾2D座標系中, 我們用 (x, y) 表示笛卡爾空間中的一個 2D 點,而處於無限遠處的點 (∞,∞) 在笛卡爾空間裡是沒有意義的。所以我們是無法解釋這種現象的,但是在齊次空間中,我們可以解釋這種現象.

371396375-09ba69d486c6b1f8

帶著上面的兩個問題,我們開始我們的齊次座標之旅.其實齊次空間的出現主要是用於投影問題的解決.所謂齊次座標就是將一個原本是n維的向量用一個n+1維向量來表示. 4D齊次空間有4個分量分別是(x,y,z,w),第四個是w,稱為齊次座標.那麼在3D笛卡爾座標系中可以使用其次座標表示為(x/w,y/w,z/w).

那麼我們就解決第一個問題,解釋兩條平行線投射到一個2D平面中相交於一點.我們知道在2D笛卡爾座標系中用Ax+By+C= 0表示一條直線.兩條平行直線相交的話,要關聯兩個方程式.如下所示.

381396375-a30c62265132d98b

在笛卡爾座標系中,上述的兩者如果相交,那麼C=D=0,也就是兩者是同一條過原點的直線.顯然是解釋不了兩條平行線相交於一點的.如果我們引入齊次座標的概念的話,我們把x/w, y/w 代替 x, y 放到投影空間裡,如下所示.

391396375-c24827200f855e54

上面的方程式組可以轉換為下面的方程式組.

401396375-871056d4f3d24c95

在C≠D的情況下,那麼對方程組求解,就是w = 0兩條直線相交,那麼就是(x,y,0).兩條直線相交於無限遠處.

那麼引進齊次座標有什麼必要,它有什麼優點呢?
1.它提供了用矩陣運算把二維、三維甚至高維空間中的一個點集從一個座標系變換到另一個座標系的有效方法.
2.它可以表示無窮遠的點。n+1維的齊次座標中如果h=0,實際上就表示了n維空間的一個無窮遠點。對於齊次座標[a,b,h],保持a,b不變, 點沿直線 ax+by=0 逐漸走向無窮遠處的過程.

4X4平移矩陣


3D圖形:矩陣與線性變換我說過幾種線性變換,比如旋轉,縮放,映象等等,唯獨沒有平移,但是在日常開發過程中,平移應該算的上我們很常用的一種仿射變換了.那麼這是為什麼呢?根據書上所說,矩陣的乘法性質所決定的,零向量總是變換成零向量,所以任何矩陣的乘法表達的變換是不會有平移的.但是我們卻可以使用4X4平移矩陣表示3D環境中的平移變換,使用3X3平移矩陣表示2D環境中的平移變換.(假設w不變且w = 1)具體公式如下所示.

411396375-d0864430e70b4458
4X4平移矩陣
421396375-03f685d5dff259ad
3X3平移矩陣

雖然在4D中,矩陣的乘法仍然是線性的,矩陣的乘法不能表示4D中的平移,卻能代表著3D環境中的平移變換.

結束


在寫這篇部落格自我認為收穫最大的莫過於平移變換矩陣了,因為其他我們子啊平常開發過程中可能使用的不太多,但是平移,縮放,旋轉這三個常見的仿射變換確實最常見的.對於本篇文章中還有幾個一知半解的位置,一個是對齊次座標的解釋.一個是4X4平移矩陣的推導過程,如果有深入對這方面有所瞭解的大神,希望能對此解釋解釋,騷棟感激不盡.下一篇部落格我將對投影座標系,以及透視投影做深一步的瞭解研究.如果喜歡騷棟,可以關注我,謝謝.

最後還是要附上<<3D數學基礎 圖形與遊戲開發>>的pdf版的傳送門.

–> <<3D數學基礎 圖形與遊戲開發>>傳送門?

相關文章