一、前言
最近一邊複習Docker,一邊就繼續複習和學習線性代數。當然我也想將D3D12系列教程要繼續下去,而目前這個系列的教程要繼續深入下去,就必須進入以Shader爲核心的主題,此時我發現數學其實將成爲真正的核心,因爲在Shader的編程中基本都是向量、矩陣、顏色等等的計算與變換了。思前想後,乾脆先換個話題,將3D數學好好的做一系列教程出來,作爲深入Shader編程教程的前置教程。接着我又發現如果只是講解純粹的3D數學,並且只是淺嘗輒止的類似一般的3D數學的教程的話,要徹底駕馭Shader編程也還是遠遠不夠,這甚至需要深入掌握諸如微積分、線性代數、傅里葉變換、頻譜、隨機數生成等等系列的數學知識才有可能徹底掌握Shader的編程。其中尤其是線性代數更是核心中的核心。
基於這樣的認知,乾脆我就大規模的複習和學習起數學來,並且先以線性代數作爲突破口。這篇教程其實是作爲一個熱身教程推出來,或者也還算不上教程,嚴格來講只是一篇學習筆記而已。
OK,下面就言歸正傳,開始看一下爲什麼說判斷一個矩陣是否可逆,通過計算它的行列式是否爲0就可以了。當然計算行列式的方法以及計算矩陣的逆矩陣的方法也有很多,證明二者同時成立的關係也有很多,其中主要的就是通過計算代數餘子式,以及伴隨矩陣的方法。通過這個計算過程,對矩陣的伴隨矩陣乘以一個矩陣行列式的倒數就得到了矩陣的逆矩陣,這個方法僅僅是在理論上推導出了一個計算逆矩陣的方法,同時也證明了只有矩陣行列式不爲0時纔可能取其倒數最終計算矩陣的逆矩陣,也就是當矩陣的行列式不爲0時,矩陣的逆才存在。實際的計算中,其實沒法利用這個方法,一來計算量太大,光計算一個矩陣的行列式值就已經很耗時了,二來這個方法要計算大量的代數餘子式,並且其過程很不直觀,一般也是很不容易理解的。當然這也是很多線性代數教科書上的標準內容,但我認爲以這樣的基礎來理解矩陣行列式不爲0即可求逆的原理來說,是非常困難的。
在我複習《線性代數及其應用》這本經典教程的過程中,我發現書中給了一個比較直觀的說明,也比較容易理解。當然書中並沒有基於此給出複雜的證明,只是一個簡單的說明,同時也是用了比較小規模的3X3形式的矩陣來做了例證說明而已,並且其過程及其簡化,對於喜歡刨根問底的我來說,此時就是自己動手把書上略去的演算過程全部推導一遍。這篇博客就把整個過程詳實的推導,記錄並分享給大家。這裏要提醒各位的是這個不是嚴格意義上的數學證明,只是一個以一般的3X3矩陣作爲例子的演算推導過程,但是它對於我們理解爲什麼矩陣行列式不爲0可求逆的原因有了一個不同角度的認識。
二、矩陣行變換得到上三角陣
對於一個一般的3X3矩陣:
⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤
做行變換,以便得到上三角陣,首先對上述矩陣的第二行和第三行乘以一個合適的因子a11之後再減去各自對應的倍數後,可以使第二行和第三行的第一列元素變爲0,其中第二行乘以a21,第三行乘以a31,過程如下:
⇒⎣⎡a11a11∗a21a11∗a31a12a11∗a22a11∗a32a13a11∗a23a11∗a33⎦⎤−⎣⎡0a21∗a11a31∗a110a21∗a12a31∗a120a21∗a13a31∗a13⎦⎤⇒⎣⎡a1100a12a11∗a22−a21∗a12a11∗a32−a31∗a12a13a11∗a23−a21∗a13a11∗a33−a31∗a13⎦⎤
接着用同樣的方法,想辦法繼續消去第三行中第二列的元素,使其爲0,也就是繼續對第三行先乘以第二行第二列a11∗a22−a21∗a12之後再減去第三行乘以第三行第二列的元素a11∗a32−a31∗a12,過程如下:
⇒⎣⎡a1100a12(a11∗a22−a21∗a12)(a11∗a22−a21∗a12)∗(a11∗a32−a31∗a12)a13(a11∗a23−a21∗a13)(a11∗a22−a21∗a12)∗(a11∗a33−a31∗a13)⎦⎤⎣⎡00000(a11∗a32−a31∗a12)∗(a11∗a22−a21∗a12)00(a11∗a32−a31∗a12)∗(a11∗a23−a21∗a13)⎦⎤
這樣就得到了與原矩陣等價的如下的上三角陣:(注意上面我們進行的是行初等變換,所以兩個矩陣等價)
⇒⎣⎢⎢⎡a1100a12(a11∗a22−a21∗a12)0a13(a11∗a23−a21∗a13)((a11∗a22−a21∗a12)∗(a11∗a33−a31∗a13))−((a11∗a32−a31∗a12)∗(a11∗a23−a21∗a13))⎦⎥⎥⎤
其中矩陣主對角線上最後一個元素可以進一步做如下的展開計算:
⇒((a11∗a22−a21∗a12)∗(a11∗a33−a31∗a13))−((a11∗a32−a31∗a12)∗(a11∗a23−a21∗a13))⇒(a11∗a22∗a11∗a33−a11∗a22∗a31∗a13−a21∗a12∗a11∗a33+a21∗a12∗a31∗a13)−(a11∗a32∗a11∗a23−a11∗a32∗a21∗a13−a31∗a12∗a11∗a23+a31∗a12∗a21∗a13)⇒a11∗a22∗a11∗a33−a11∗a22∗a31∗a13−a21∗a12∗a11∗a33+a21∗a12∗a31∗a13−a11∗a32∗a11∗a23+a11∗a32∗a21∗a13+a31∗a12∗a11∗a23−a31∗a12∗a21∗a13⇒a11∗a22∗a11∗a33−a11∗a22∗a31∗a13−a21∗a12∗a11∗a33−a11∗a32∗a11∗a23+a11∗a32∗a21∗a13+a31∗a12∗a11∗a23⇒a11∗(a11∗a22∗a33−a13∗a22∗a31−a12∗a21∗a33−a11∗a23∗a32+a13∗a21∗a32+a12∗a23∗a31)⇒a11∗(a11∗a22∗a33+a13∗a21∗a32+a12∗a23∗a31−a13∗a22∗a31−a12∗a21∗a33−a11∗a23∗a32)
最後就可以發現,上述公式,其實就是a11乘以原矩陣的行列式:
a11∗(a11∗a22∗a33+a13∗a21∗a32+a12∗a23∗a31−a13∗a22∗a31−a12∗a21∗a33−a11∗a23∗a32)⇒a11∗det∣∣∣∣∣∣a11a21a31a12a22a32a13a23a33∣∣∣∣∣∣
根據上三角陣的性質,以及矩陣主元的性質,要使原矩陣可逆,那麼等價的上三角陣中主對角線上的元素就不能爲0,此時就有:
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧a11=0(a11∗a22−a21∗a12)=0a11∗(a11∗a22∗a33+a13∗a21∗a32+a12∗a23∗a31−a13∗a22∗a31−a12∗a21∗a33−a11∗a23∗a32)=0
根據以上條件,最終就有:
(a11∗a22∗a33+a13∗a21∗a32+a12∗a23∗a31−a13∗a22∗a31−a12∗a21∗a33−a11∗a23∗a32)=0⇒∣∣∣∣∣∣a11a21a31a12a22a32a13a23a33∣∣∣∣∣∣=0
這樣就說明了矩陣可逆就要判定其行列式是否爲0的原因,其實從推導過程中可以看出,矩陣行列式的值實質上是蘊含在了將原矩陣通過初等行變換變爲上三角陣的過程中,只是過程中的式子有些複雜,對於高於3階的一般矩陣來說,推導的過程就顯得有些囉嗦龐雜了,這估計也是爲什麼一般的線性代數教科書上不已此爲基礎來證明矩陣可逆通過判定其行列式是否爲0的定理的原因了。或者說,矩陣的初等行變換本身就蘊含了矩陣行列式的計算過程,最終主對角線上的最後一個元素中就包含了矩陣行列式因子,這個因子不爲0才能保證該元素不爲0,是最終保證矩陣等價上三角陣主對角元素不爲0 的一個充分條件,而只是上三角陣主對角元素都不0時,上三角陣纔可逆,從而原矩陣可逆。