前言
在前面我們說到關(guān)于矩陣的一些計算知識,相信大家已經(jīng)覺得進入了水深火熱之中了,那么為了讓大家感到更加刺激的視覺體驗和感官體驗,這一篇博客,我將對矩陣的行列式,矩陣的逆,正交矩陣,齊次矩陣進行探討研究整理.我很慶幸你們看到這里了,為什么這么說呢?其實呢,因為齊次矩陣是我們平常開發(fā)用的比較多的,我曾經(jīng)在Core Graphics框架 :仿射變換與齊次坐標簡單的提到過(小白視角),這篇我將對齊次矩陣進行進一步的說明.
那么接下來,好戲登場了.
矩陣的行列式
在任意的一個方陣都存在這樣的一個標量,稱作該方陣的行列式.一開始如果我一頓說概念,可能到時候懵的就不單單是讀者了,連我自己都會懵逼的,我們就用實際的例子來說明行列式以及行列式的幾何意義.
線性運算法則
首先,我們先看方陣M的行列式為 |M|,(注明:非方陣的行列式是未定義的)我們先從最簡單的2x2的方陣來說明.2x2的方陣的行列式具體的定義如下所示.
那么這里要注意的一點就是不能書寫行列式的時候,不能像矩陣使用方括號了,我們要使用的是兩條豎線...
根據(jù)書上所說的,我們可以這樣進行記憶計算過程,將主對角線和反對角線的元素各自相乘,然后主對角線上的積減去反對角線元素的積.如下圖所示.當然了,這是適用于2x2方陣的行列式的計算,3x3方陣的行列式計算可不是這么簡單的,要麻煩的多得多.客官容我慢慢道來.
2x2方陣的行列式的計算例子如下所示.
上面基本就是2x2方陣行列式的計算的所有內(nèi)容了,接下來我們看3x3方陣行列式的計算.首先我們先看一下3x3方陣行列式的定義.
看上去是不是很麻煩?其實當我們掌握它的計算技巧之后,可以很簡單的計算出來.首先先把矩陣M連寫兩遍,接著如圖所示進行計算.
好了經(jīng)過2x2方陣和3x3方陣的洗禮,我們逐漸懵圈了,而且方陣的難道我們就只能這樣計算行列式嗎?不不不,數(shù)學(xué)界的前輩們已經(jīng)為了我們留下來寶貴的計算方式,那就是余子式和代數(shù)余子式,兩者的使用和不同就讓我們一睹為快吧.
首先我們先看一下余子式.我們首先看一下概念,假設(shè)一個矩陣M,去除第i行和第j列之后剩下的矩陣就是矩陣M的余子式(i和j的限制條件就不過多解釋說明了),記法如下所示.
接下來,我們用一個示例來做一下說明余子式是如何生成的.
上面我們已經(jīng)對余子式的定義和計算方法有所了解.那么接下來,我們要對余子式的相關(guān)知識來做一下說明.那么什么叫代數(shù)余子式呢?
代數(shù)余子式是這樣定義的,對于一個方陣M,給定行、列元素的代數(shù)余子式等于對應(yīng)的余子式的有符號的行列式.我們把上面的這句定義給提煉一下,某個矩陣的代數(shù)余子式是行列式,那么我們已經(jīng)注意到了,某個矩陣的余子式是一個矩陣.這樣我們就知道兩者的不同之處了,一個是標量,一個是矩陣,這就是兩者的不同之處.好了,了解完兩者的不同之處之后,我們來看代數(shù)余子式的計算方法是怎么定義的,如下所示.
只有上面的公式讓我們感到很無助不是,那么接下來我們用一個接著余子式的示例來求解對應(yīng)的代數(shù)余子式.如下所示.
那么說了這么多余子式和代數(shù)余子式的知識,到底對我們的行列式的求解有什么幫助呢?其實,我們是可以利用余子式和代數(shù)余子式直接計算任意n維方陣的行列式,首先,我們找到矩陣的任意一行i(i不大于最大行數(shù)),然后,列數(shù)j依次增加.具體的計算公式如下所示.
那么有了公式之后避免不了就是驗證,接下來我們就用公式來推導(dǎo)4x4方陣的行列式.由于有了計算公式的便利,我們計算起來就比較方便了,但是我們要仔細判斷每一個項的正負(自己驗證的時候沒注意,驗證出錯兩三遍).這里,我選擇的i =1(自己驗證的時候可自行選擇i) ,具體的驗證過程如下所示.(由于其中的項過多,所以分兩步截圖.)
通過上面我們發(fā)現(xiàn),行數(shù)列數(shù)越多的方陣行列式的復(fù)雜度就會越高.復(fù)雜度會呈指數(shù)增長.我們計算到4x4的就已經(jīng)非常的麻煩了(其實4x4的行列式我們已經(jīng)夠用了),那么要是在來個10x10的方陣行列式,我們豈不要瘋掉?這里,書中提到了一種行列式的計算方式叫做"主元選擇"的計算方式,感興趣的小伙伴可自行查詢資料.
上面我們已經(jīng)說完了行列式,但是說了一大堆,我們還是懵圈的,那么行列式是用來干什么的呢?或者說是行列式代表著什么意義呢?其實,在2D中行列式代表著以基向量為兩邊的平行四邊形的有符號面積.在3D環(huán)境中則代表著以基向量為三邊的平行六面體有符號體積.我們看以下示例來驗證我們的想法.
如圖所示,在2D環(huán)境中有基向量v = [3 0] ,u = [1 2].
那么它的面積是3x2 = 6,它的行列式是3x2-1x0 = 6,我們發(fā)現(xiàn)行列式是和面積相等的(當然了,如果基向量v = [-3 0] ,行列式最終計算出來的值為-6)
接下來,我們看一下在3D環(huán)境中的有三個基向量u = [2 0 0],v = [1 2 0],w= [0 0 1],如圖所示.
然后我們計算由上面三個基向量所圍成的正六面體的體積為1x2x2 = 4,計算的三個基向量所組成的矩陣的行列式.發(fā)現(xiàn)兩者的絕對值是相等的.如下所示.
矩陣的逆
矩陣的逆和矩陣的轉(zhuǎn)置是有所不同的,矩陣的轉(zhuǎn)置請查看3D圖形:矩陣的相關(guān)知識.求逆運算有個先決條件,那就是只有方陣才可以進行求逆運算.
首先我們看一下方陣的逆是如何定義的.假設(shè)一個方陣M,方陣M的逆,記作M^-1,方陣的逆也是一個矩陣.當M和M^-1相乘的時候,結(jié)果是單位矩陣I.如下所示.
那么我該如何計算方陣M的逆呢?在我看的3D圖形上是給出了如下的方法.
在上面的公式中矩陣的行列式我們知道如何求解,那么adj M是什么鬼?adj M叫做矩陣M的伴隨矩陣,定義為矩陣M的代數(shù)余子式矩陣的轉(zhuǎn)置矩陣(挺繞口).沒事,我們看一下示例是如何解釋的這個的.假設(shè)矩陣M如下所示.
那么接下來,我們把矩陣中所有的元素的代數(shù)余子式求解出來,如下所示.
那么代數(shù)余子式的轉(zhuǎn)置矩陣(adjM)如下所示.
代數(shù)余子式的轉(zhuǎn)置矩陣(adjM),我們已經(jīng)求解出來了,接下來,我們就要求解矩陣的逆了.套用公式計算過程如下所示.
上面我們知道了矩陣的逆的概念和計算方法,那么它的實際作用是什么呢?或者說是它的幾何意義是什么呢?其實矩陣的逆主要適用于"撤銷"功能的實現(xiàn).比如一個向量ν通過矩陣M進行了變換,然后呢,我們可以再呈上M的逆矩陣,這樣就撤銷了變換動作了,驗證過程如下所示.
正交矩陣
先來看一下正交矩陣是如何定義的,若方陣M是正交的,則當且僅當M與他的轉(zhuǎn)置矩陣M^T的乘積等于單位矩陣,那么就稱矩陣M為正交矩陣.
在矩陣的逆中我們知道,矩陣的逆和矩陣的乘積為單位矩陣I,由此推理,我們可以知道,如果該矩陣為正交矩陣,那么矩陣的逆和轉(zhuǎn)置矩陣是相等的.
那么正交矩陣存在的意義是什么呢?其實如果一個矩陣是正交矩陣,那么矩陣的逆和轉(zhuǎn)置矩陣是相等的.轉(zhuǎn)置矩陣是非常簡單計算的,而計算矩陣的逆如果使用代數(shù)余子式計算是非常的麻煩,所以我們可以直接計算轉(zhuǎn)置矩陣然后直接得到該矩陣的逆.
4X4齊次矩陣
DuangDuangduang~本文的最重要的部分--齊次矩陣,在說其相關(guān)內(nèi)容之前,我們要先用兩個比較經(jīng)典的示例來說一下齊次空間是如何出現(xiàn)的,(范例是從網(wǎng)上尋找到,莫怪)
兩條平行線會相交嗎?
在沒有認識到齊次空間之前,我們知道兩條平行線是不能相交的,但是兩條平行線真的不能相交嗎?我們看下面這幅圖,我們都知道兩條鐵軌是平行的,但是這兩條平行的鐵軌在無窮遠處會相交于一點.這對嗎?在笛卡爾2D坐標系中, 我們用 (x, y) 表示笛卡爾空間中的一個 2D 點譬巫,而處于無限遠處的點 (∞,∞) 在笛卡爾空間里是沒有意義的咖楣。所以我們是無法解釋這種現(xiàn)象的,但是在齊次空間中,我們可以解釋這種現(xiàn)象.
帶著上面的兩個問題,我們開始我們的齊次坐標之旅.其實齊次空間的出現(xiàn)主要是用于投影問題的解決.所謂齊次坐標就是將一個原本是n維的向量用一個n+1維向量來表示. 4D齊次空間有4個分量分別是(x,y,z,w),第四個是w,稱為齊次坐標.那么在3D笛卡爾坐標系中可以使用其次坐標表示為(x/w,y/w,z/w).
那么我們就解決第一個問題,解釋兩條平行線投射到一個2D平面中相交于一點.我們知道在2D笛卡爾坐標系中用Ax+By+C= 0表示一條直線.兩條平行直線相交的話,要關(guān)聯(lián)兩個方程式.如下所示.
在笛卡爾坐標系中,上述的兩者如果相交,那么C=D=0,也就是兩者是同一條過原點的直線.顯然是解釋不了兩條平行線相交于一點的.如果我們引入齊次坐標的概念的話,我們把x/w, y/w 代替 x, y 放到投影空間里,如下所示.
上面的方程式組可以轉(zhuǎn)換為下面的方程式組.
在C≠D的情況下,那么對方程組求解,就是w = 0兩條直線相交,那么就是(x,y,0).兩條直線相交于無限遠處.
那么引進齊次坐標有什么必要,它有什么優(yōu)點呢缕题?
1.它提供了用矩陣運算把二維截歉、三維甚至高維空間中的一個點集從一個坐標系變換到另一個坐標系的有效方法.
2.它可以表示無窮遠的點。n+1維的齊次坐標中如果h=0烟零,實際上就表示了n維空間的一個無窮遠點瘪松。對于齊次坐標[a,b,h],保持a,b不變锨阿, 點沿直線 ax+by=0 逐漸走向無窮遠處的過程.
4X4平移矩陣
在3D圖形:矩陣與線性變換我說過幾種線性變換,比如旋轉(zhuǎn),縮放,鏡像等等,唯獨沒有平移,但是在日常開發(fā)過程中,平移應(yīng)該算的上我們很常用的一種仿射變換了.那么這是為什么呢?根據(jù)書上所說,矩陣的乘法性質(zhì)所決定的,零向量總是變換成零向量,所以任何矩陣的乘法表達的變換是不會有平移的.但是我們卻可以使用4X4平移矩陣表示3D環(huán)境中的平移變換,使用3X3平移矩陣表示2D環(huán)境中的平移變換.(假設(shè)w不變且w = 1)具體公式如下所示.
雖然在4D中,矩陣的乘法仍然是線性的,矩陣的乘法不能表示4D中的平移,卻能代表著3D環(huán)境中的平移變換.
結(jié)束
在寫這篇博客自我認為收獲最大的莫過于平移變換矩陣了,因為其他我們子啊平常開發(fā)過程中可能使用的不太多,但是平移,縮放,旋轉(zhuǎn)這三個常見的仿射變換確實最常見的.對于本篇文章中還有幾個一知半解的位置,一個是對齊次坐標的解釋.一個是4X4平移矩陣的推導(dǎo)過程,如果有深入對這方面有所了解的大神,希望能對此解釋解釋,騷棟感激不盡.下一篇博客我將對投影坐標系,以及透視投影做深一步的了解研究.如果喜歡騷棟,可以關(guān)注我,謝謝.
最后還是要附上<<3D數(shù)學(xué)基礎(chǔ) 圖形與游戲開發(fā)>>的pdf版的傳送門.