求解矩陣的逆:
接着https://www.cnblogs.com/webor2006/p/14280299.html繼續往下學習,在上一次中學習了線性系統以及它的求解, 在之前https://www.cnblogs.com/webor2006/p/14271706.html的學習矩陣的逆時遺留了一個問題,回憶一下:
由於已經學習了線性系統的求解了,所以此時就可以來解答這么一個遺留的問題了,先來回憶一下什么是矩陣的逆:
注意:只有方陣才有逆矩陣哦,那假設矩陣A有逆矩陣,比如這樣的矩陣:
那如何求得該矩陣的逆矩陣呢?根據逆矩陣的特性,可以有如下變換:
其中I是單位矩陣,由於A是二行二列的方陣,它對應的單位矩陣很顯然就是等號最后的這個了,而根據矩陣的乘法規則,此時就可以得知A的逆矩陣一定也是2x2的矩陣,所以此時可以直接假設:
所以此時的式子就可以變為:
此時的目標就是來求解x11、x12、x21、x22了,下面來看一下,此時它又可以拆成:
而根據矩陣x向量的定義,再一次將其拆解:
而此時就可以列一個線性方程組了,如下:
那是不是對於求解矩陣的逆可以歸到上次咱們學習的對於線性系統的求解上來呢?答案是的。 如果此線性系統有唯一解那么咱們的逆矩陣也就有答案了;而如果無解那說明此矩陣是沒有逆矩陣的;而如果有無數解說明啥呢這個之后再說,因為此式子應該不存在無數解的情況。對於上面合成了一個有四個方程2個未知數的方程組其實可以不合,可以分別化作2個小的線程系統分別進行求解,如下:
而對於圖中的*其實就對應我們想要求解矩陣的逆矩陣的未知數,所以又可以表示為:
而既然這倆增廣矩陣的系數矩陣是一模一樣的,那其實可以將這倆增廣矩陣對應的結果向量合到一起來,不用分開進行求解,啥意思?
此時關鍵的來了,對於此時就可以找到一個比較好求解矩陣逆的方式了,對於上面合起來的增廣矩陣其實又可以得到下面這個式子:
目前咱們舉例是一個方陣的情況,其實對於非方陣此式子也滿足,通過這么一個等式就可以發現:對於一個矩陣的求逆過程其實就是將它化成最簡形式之后其結果所構成的矩陣,所以下面很快就可以求得矩陣A的逆矩陣了,如下:
對於增廣矩陣的求解不是還有可能是無解,無數解的情況么?那下面針對它再來進行一個討論,其實目前咱們的這個增廣矩陣是不可能有無數解的,用抽象的思維來看:
因為化為最簡形式之后的非零行是2,而剛好等於未知數的個數,並沒有一個全0行,當然也就不存在無數解嘍。另外也有可能是無解,因為最后一行如果c,d都取0那就產生矛盾了,目前只是針對2x2的方陣對於無解的描述是這樣的,那如果是nxn的方陣呢?此時對於無解的定義就可以抽象為:“當系統矩陣化為行最簡形式時有0行既說明無解,也就說明矩陣不存在逆。【這個結論很重要,未來還會用到】”
最后,這里還有一個小問題需要提示一下,目前咱們只求了矩陣的右逆:
而根據矩陣逆的概念同時也要求它的左逆相乘也為單位矩陣才行,其實對於這塊是有一個結論的:“如果一個方陣A有右逆B,則B也是A的左逆,既B是A的逆。”,關於這個性質目前所學的知識還不足以證明,在之后再來研究。
實現求解矩陣的逆:
接下來則用python來實現一下求解矩陣的逆,還是對於咱們之前的LinearSystem類進行一下改造。
增廣矩陣支持結果矩陣:
由於在求解矩陣的逆時用的增廣矩陣其結果不再是一個向量了,而是一個矩陣,所以需要在構造中增加對於矩陣的邏輯判斷,如下:
inv():
接下來定義求解逆矩陣的函數,這里將其設計成自由函數,如下:
關於為啥要將它設計成這樣一個有別於其它函數的原因這里不深究【因為它不屬於LinearSystem類中的方法,也就是到時調用時是直接來調用】,待未來有時間系統學習python時再來尋找答案,下面繼續:
當經過消元之后有解,接下來則就可以根據結果矩陣來取出逆矩陣了,如下:
測試:
接下來調用一下:
由於精度的問題可能看着跟預期有些誤差,其實它跟我們之前理論描述的結果是一樣的,如下:
為了驗證此矩陣就是A的逆矩陣,下面可以再如下打印一下:
當然對於A的左逆的計算目前還沒能證明,之后會證明的。
初等矩陣:
對於上面利用線性系統求解原理來求解了矩陣的逆,而在之后的學習中還會繼續深入的分析可逆性,而為了深入的研究可逆的性質,此時需要理解一下新的概念---初等矩陣。
先來回憶一下對於線性系統求解的過程:
上面很顯然是一個高斯消元的過程,而上面變換的核心用文字總結的話就是:
1、矩陣的某一行乘以一個常數;
2、矩陣的一行加(減)另一行;
3、交換矩陣的兩行;
而對於上面其實是矩陣跟某一個元素進行操作,也就是矩陣的內部進行元素級別的操作,但是!!!在之前https://www.cnblogs.com/webor2006/p/14271706.html咱們學習矩陣時說過它也能夠表示“變換”,而當時學習矩陣的變換時是矩陣x矩陣,那。。對於上面高斯消元的過程能否用矩陣變換的視角來表示,比如:
其中E表示變換矩陣,如果能的話,那對於上面矩陣跟元素的操作就可以擴展到矩陣跟矩陣的操作了,下面來看一下:
1、矩陣的某一行乘以一個常數;
我們很容易的找到一個變換矩陣,其滿足以下特性:
其實此矩陣就是一個單位矩陣,上面這式子其實也就是單位矩陣的特性,那如果想讓某一行乘以一個常數,是不是只要變換單位矩陣既可,比如咱們想讓第一行乘以K,就可以修改左乘的單位矩陣為:
也就是只要將單位矩陣的相應行的1改成一個常數, 那么矩陣相應的行的元素就都乘以了該常數了。
2、矩陣的一行加(減)另一行;
類似的思路,咱們有木有可能找到一個變換矩陣達到對某行的加(減)操作呢?比如:
其實很容易就可以找到此變換矩陣,如下:
上面這個是加的操作,下面再來看一個減的例子:
要找到一個變換矩陣,能達到讓第一行減去第三行的效果,其最終的矩陣如下:
在進行矩陣消元過程中可能還會出現一行加(減)另一行的若干倍的情況,同樣的,也能很輕松的找到對應的變換矩陣,如下:
3、交換矩陣的兩行;
接下來再來看一個交換兩行的例子:
能否找到一個矩陣,讓其第二行和第三行進行交換呢?其實也很簡單,如下:
總結一下上面說的三種情況:
而對於矩陣的操作,其實最終只要來對單位矩陣進行操作就好了,如下:
對於我們來說就可以獲得可以完成矩陣的基本操作所對應的變換矩陣了,好!!!接下來新的名詞要出現了,對於上述圖進行描述:
其中初等矩陣它的概念為:對單位矩陣進行一次初等變換得到的結果矩陣,通常記做E。好,有了這么個概念之后,這里對於之前使用Gauss-Jordan消元法把矩陣化為行最簡形式的過程,其實有一個新的視角來理解了,就是它其實是尋找一系列初等矩陣E,使得:
當咱們有了這么一個視角之后,進一步會對矩陣的可逆性有一個更加深刻的理解了,不過得要先從初等矩陣的可逆性談起。
從初等矩陣到矩陣的逆:
接下來則來探究初等矩陣的可逆性,對於初等矩陣它有三種形式:
如上面所述:初等矩陣是對單位矩陣進行一次初等變換得到的,而因為初等變換是可逆的,所以初等矩陣也是可逆的。對於初等變換是可逆的用實際例子理解一下,比如拿上圖的第一個初等矩陣為例:
也就是對第一行都乘以K倍,而它對應的逆則是第一行都除以K,如下:
而:
所以它們之間是互為逆的。有了這個思想之后,下面就可以快速的列出其它兩個初等矩陣的逆了,如下:
呃,這個初等矩陣的逆跟初等矩陣咋一樣的呢?其實可以這樣理解,對於這個初等矩陣的意思不就是把第二行和第三行的元素交換一下么,那再交換一次不就還原了么?
知道了初等矩陣的逆之后,接一下來就可以看一般的矩陣如果可逆的話怎么能得到它的逆矩陣呢?對於A可逆,回憶一下這么個增廣矩陣:
而由於系數矩陣A可逆,那么當它化成行最簡形式時一定是單位矩陣,所以:
好,此時就可以進行等式進一步變換了:
既然A可逆,所以等式左右都可以乘以A的逆,如下:
然后再進一步變換為:
看到木有,此時一個新的求知陣A的逆的方式就出來了,如下:
也就是說對於增廣矩陣的系數矩陣A通過一系列的初等變換將其化為行最簡形式之后,相應的結果矩陣也會隨着變換而變換,最終這個結果矩陣其實就是矩陣A的逆。這就是通過初等矩陣的視角來求解矩陣A的逆的另一種方式,之前求矩陣的逆是站在線性系統的角度來看的,那對於矩陣的逆跟初等矩陣和線性系統它們之間是否存在一些聯系呢?是的,這塊下面會對其進行分析。
矩陣的逆為什么重要?
在上面又以另外一個視角對於矩陣的逆重新進行了審視,那為啥矩陣的逆這么重要呢?下面就主要是闡述它的重要性。
大大加快線性系統的計算:
對於矩陣的逆來說它有一個很重要的計算功能,下面先來看一下對於一個線性系統,最終很容易可以抽象成這么一個式子:
其關鍵就是求解這個x,之前利用高斯約旦消元法可以很好的處理線性系統的這個問題,但是!!!如果對於一個系統矩陣A知道它是可逆的,此時等式兩邊直接可以乘以A逆,如下:
此時就可以馬上解出x了,如下:
對於線性系統的求解利用高斯約旦消元法和使用逆矩陣兩者的時間復雜度其實是差不多的,可能使用逆矩陣的方式性能還不及高斯約旦消元法,但是!!!如果在A不變,b會變化的條件下,會大大加快計算速度。比如說在之前學習線性系統時舉了個這樣的例子:
矩陣的逆和很多重要的命題連接在了一起:
如小標題所示,對於矩陣的逆的研究,其實它可以跟線性代數中很重要的命題聯系起來,比如對於方陣A,如果方陣A可逆,則A是非奇異矩陣(關於啥是非奇異矩陣可以參考https://www.cnblogs.com/webor2006/p/14271706.html),還有另外一些命題,如下:
也就是對於上面四個命題其實是完全等價的,也就是兩兩都相等,如下:
那要證明上面這個相等性等於要證明12個命題之間的相等,太麻煩了,其實只要按這個順序來證明就成了:
這樣由之前要證明12個命題就化簡成為了只需要證明上面四個命題了,下面來試一下:
論證命題一:
證明如下:
論證命題二:
證明如下:
既然A是一個方陣,所以可以假設A為n*n矩陣,Ax=0有唯一解,則有n個未知數,且rref(A)有n個非零行,而根據行最簡形式的定義,此時的行最簡形式一定就是單位矩陣,所以也就得證了。
論證命題三:
證明如下:
根據之前有這么一個等式:
由於初等矩陣E是可逆的,所以可以左右兩邊都來乘一系列的初等矩陣的逆:
而根據結合率:
所以又可以變換成:
而對於初等矩陣的逆其實還是初等矩陣,那不就論證了A可以表示成一系列初等矩陣的乘積對么?
論證命題四:
證明如下:
既然A可以表示一系列初等矩陣的乘積,所以有如下式子:
而此時就可以直接構造一個矩陣A,如下:
因為A是可逆的,所以此時就可以得到:
而再變換:
此時又得證了。
上面已經將四個命題論證成功了,所以以后看到這些命題直接認為是相同的既可:
這個等價性在后續的新命題的學習中是會用到的,而且會不斷往這個等價命題中進行添加,另外對於上面五個命題的反命題其實也是等價的,如下:
比如:
而矩陣A不可逆的這個反命題它的結論是A的行最簡形式存在零行,其實跟之前咱們在線性系統中的結論剛好吻合:
總結:
上面說了一大堆,其實就是對於矩陣的逆的一個重要性的描述,對於之后進一步深入學習線性代數原理的時候都會用到這些等價命題,之后對於這個等價命題還會不斷的擴充,到最后就有一個非常嚴謹的論據存在的,總之目前先對上面提到的各個等價命題有個印象既可,待之后深入學習新的命題時需要用到這些命題時再來加深印象,不要覺得說了一大堆費話毫無亂用就行,反而這個抽象的小節是整篇中最最重要的~~
矩陣的LU分解:
什么是矩陣的分解?
接下來要來學習一個全新的概念了,如小標題所示,首先先來看什么是分解,其實這塊在小學數學中有類似的概念----數的分解,對於任何一個數可以分解成若干個素數的乘積,比如:66 = 2 * 3 * 11,它叫質因數分解。而對於一個矩陣也可以分解成幾個矩陣乘積的形式,而對於矩陣之所有能分解其實也是有它目的性的,而隨着學習的深入會接觸到幾種不同的矩陣的分解方式,而每種分解都是有不同的目的的,那咱們目前首先學到的是矩陣的LU分解,其實它是為了提高計算效率為目的。其實關於矩陣的LU分解在很多線性代數書中並不一定會提及它,但是!!!它是初等矩陣的一個非常好的應用,既然上面我們已經學習到了初等矩陣了,光空談有啥用呢?所以學習它也正好對咱們之前所學的概念進行一個鞏固。
什么是矩陣的LU分解?
其實矩陣的LU分解就是將一個矩陣A分成2個矩陣的乘積,如這樣:
為啥要用L、U來表示呢?其實L是表示【以方陣為例】:
也就是矩陣中上面的元素都為0,而有效的元素全在主對角線的下面。而U表示:
也就是下面的元素都為0,而有效的元素都在上面三角上。
更進一步的話,其實對於L下三角矩陣是這樣的:
也就是主對角都為1,對於這樣一個矩陣還有另一個專用名詞---單位下三角矩陣。但是要注意了,對於LU分解來說,不保證U的上三角矩陣也是主對角為1的。
矩陣的LU分解過程:
那一個矩陣真的可以分解成LU這兩個矩陣的乘積么?下面先來回憶一個高斯消元法的過程:
看到木有,其實高斯消元法的過程,就是通過初等變換,把一個矩陣變成了上三角矩陣了對不?所以此時可以記這么一個式子:
由於初等矩陣都是可逆的,為了消掉它們則可以左右乘以初等矩陣的逆,如下:
此時又可以根據結合性將其化為:
則根據A = L * U,所以式子又可以化為:
也就是各個初等矩陣的逆相乘就得到了LU分解的下三解矩陣了,下面以一個具體的例子再來理解一下上面的轉換式子:
其中L是由一系列初等矩陣的乘法,而初等矩陣都是由單位矩陣變換而來的,所以這里先標一個單位矩陣:
接下來則進行高斯消元法:
1、先將第一行主元下面的行都變為0:
先讓第二行-4*的第一行,如下:
好,而此時初等矩陣的應用就需要用到了,對於這一步讓矩陣的第二行-4*第一行,它所對應的初等矩陣【開始使用初等矩陣來思考了】應該是:
而對於L矩陣而言其實就是所對應初等矩陣的逆,所以此時L為:
接一下再將主元列的第三行3化為0,讓第三行減去3倍的第一行,很簡單:
而此次消元其實就是讓矩陣A左乘了如下這個初等矩陣:
而L它是初等矩陣的逆,所以此時形態變為:
2、將第二行主元-3下面的行都變為0:
按正常的高斯消元規則需要將-3化為1,不過這里為了簡便直接將它下面的元素歸0既可,也就是讓第三行減去3倍的第二行,如下:
此步所對應的初等矩陣為:
所以L矩陣是初等矩陣的逆,所以此時為:
此時看到木有,對於L這個矩陣已經是一個下三角矩陣,其實也很好理解,因為對於高斯消元法而言就是將主對角線下面的元素都化為0,而L是矩陣的逆倒過來不就是對角線上面的為0,也是符合下三角矩陣了,注意:在LU分解中,由於對於主元位置不歸一,所以L矩陣就是單位下三角矩陣,也就是主對角線都為1,所以此時對於矩陣的LU分解的結果就為:
但是!!!這里在高斯消元過程程中沒有涉及到兩行元素的交換操作,因為一旦涉及到行交換,很明顯其L就不滿足下三角矩陣的形態了,所以重要的結論如下:
矩陣可以進行LU分解的條件:對矩陣A進行高斯消元的過程中,不需要交換兩行的位置,如果涉及到兩行位置的交換則該矩陣不滿足LU的分解。
為什么進行矩陣的LU分解【比較繞,了解】?
在最后再來探討一下為啥要進行LU分解操作?在解Ax=b的過程中,LU分解的時間復雜度大概為:O(0.5n^3)【整個矩陣有n^2個元素,主對角線下面的元素大概占一半,也就是0.5n^2,而在高斯消元過程中需要將主對角線下面的元素都消成0,此時就需要用一行加(減)每一行的倍數對不?此時這種操作大概是n個操作,所以整個時間復雜度就為0.5n^3,而對於L而言只需要將高斯過程中的倍數填在它所對應的單位矩陣上既可,不耗時間,所以整體的LU分解時間復雜度就是0.5n^3】,而對於矩陣A進行了LU分解之后,此時的Ax=b的等式就可以變換為:
接下來假設U*x = y ,所以就有如下式子:
此時求出y只需要O(n^2)次操作,為什么?這是因為對於:
此時對於L來說第一行只有第一個元素為1,所以此時y1等於b1:
而知道了y1之后,對於L中的第二行只有y1和y2,那將y1代入進去y2也很快能求出來,同理對於第三行將y1和y2也代入求出y3,整體來說就是L矩陣中所有非0的元素和已經求出來的y乘一下就夠了,最終就可以算出所有的y,所以整個計算次數大概是O(0.5n^2)的操作,而由於O表示時間復雜度系數不重要,所以最終時間復雜度就可以是O(n^2)。
一旦求出來了y之后,那么對於這個假設的式子U*x = y,那對於x也可以算出來了,它時次數也是O(n^2),因為此時的U矩陣是一個上三角矩陣,它的過程跟L是相反的,也就是從下往上:
對於最后一行可以有如下等式:14 * xn = yn,而yn是已知了,所以xn也可以求出來,接下來再往上一行,將xn代入就很快的能求解出xn-1,依此類推,整個過程就可以把x求出來了,時間復雜度跟求y差不多的。
經過上面LU分解的方式就求出了x這個矩陣了,時間大概用了:
而對比求解矩陣的逆來求解線性系統的x大概是要用:
這時回憶一下這種求解的過程:
也就是將左側的增廣矩陣的系數矩陣化為右側增廣矩陣的單位矩陣,而右邊增廣矩陣的結果矩陣則就是矩陣的逆,而在高斯約旦消元過程中是分兩步,先對主元下面的元素進行消0,然后再對主元上面的元素消0,近乎所有的元素都要動一遍,而整個系數矩陣的元素個數是n^2個,而每一次化0其實就是每一行加(減)去另一行,而對於增廣矩陣而言每一行有2n個元素,所以整體的次數就為O(n^2*(2n)=2*n^3)。而求解出了x的逆之后,再求出x又需要經過如下變換:
它是n^2級別的操作,所以整個求逆來求解線性系統的時間復雜度就是如上了。
很明顯對於n^3的系數是用求解逆的方式較大,也就是LU分解的效率要比它要高,這也是為啥要使用LU分解的原因,它在求解線性系統時效率比較高,而事實上在計算機中比較完善的標准庫當中如果在求解線性系統算法的話,內部通過都是用LU分解來完成的。
注意:目前只考慮了方陣的LU分解,對於非方陣的情況之后再說。
實現矩陣的LU分解:
接下來則用python來實現一下矩陣的LU分解,注意一定要理解上面對LU分解的流程,因為下面代碼的實現是完全依照此流程進行編寫的。
新建文件:
在這里就不設計一個類了,直接設計一個LU的算法函數既可。
斷言:
由於目前LU分解只考慮方陣的情況,所以先斷言一下:
而為了使用方便,將矩陣的行數存到一個變量中:
取矩陣的行向量至A:
由於矩陣的LU分解其實就是進行高斯消元的過程,為了方便這里先將矩陣的行向量存到一個變量中,如下:
准備單位矩陣L:
如之前所述的LU分解思路:
咱們先來給L初始化為nxn的單位矩陣,如下:
開啟高斯消元過程:
接下來則將主元下面的行元素都化為0,注意在LU分解中不需要將主元歸1,如下:
當元素化為0之后,我們需要維護一下L這個單位矩陣,如下:
測試:
運行結果:
/Users/xiongwei/opt/anaconda3/bin/python3.8 /Users/xiongwei/Documents/workspace/python/Play-with-Linear-Algebra/LinearAlgebra/main_lu.py Matrix([[1.0, 0.0, 0.0], [4.0, 1.0, 0.0], [3.0, 3.0, 1.0]]) Matrix([[1, 2, 3], [0.0, -3.0, -6.0], [0.0, 0.0, 14.0]]) Process finished with exit code 0
這個用例其實就是咱們之前理論描述過的,剛好吻合:
為了進一步驗證咱們的LU的結果木有問題,下面再修改一下:
非方陣的LU分解,矩陣的LDU分解和PLU分解:
矩陣的LDU分解
到目前為止對於矩陣的LU分解都是探討的方陣的情況,其實對於LU分解並不只局限在方陣上的,所以這里則來探討跟LU分解更多的一些話題。
先回憶一下,對於這么一個矩陣,它的LU分解之后也還是方陣:
其實對於LU分解也是可以作用在非方陣上面的,比如如果A是一個4x6的長方陣,它的LU分解之后其實長這樣:
其中L依然是一個4x4的方陣,而U是跟A同形狀的4x6的矩陣,其實分解過程跟方陣的分解過程是一模一樣的,只是過是對這么一個長方陣進行一個高斯消元法。
下面再來看一下非方陣的情況,如果A是一個6x4的矩陣,它的LU分解形態稍稍不一樣,如下:
此時L是跟A同形的6x4的下三角矩陣,而U是4x4的上三角方陣,這里就要注意了,由於這個矩陣高比寬要大,所以從上面進行歸0會要比從下面歸0要快:
而關於非方陣的求解這里暫且只做一個了解。在LU分解中,有些時候為了避免討論到底是把下三角矩陣化為單位的下三角矩陣:
還是說把上三角矩陣化為單位的上三角矩陣:
干脆直接將這兩者都化為單位的下三角矩陣以及單位的上三角矩陣,這是說的啥意思呀,先來回憶一下當時咱們給下面矩陣做LU分解時是這樣的:
此時如果也想U也化為單位上三角矩陣呢?此時其實可以再用一個中間矩陣,這個中間矩陣只包含U的主對角線,如下:
其中這樣的矩陣有個專業名詞叫對角矩陣【這塊在后續學習還會發現它的威力所在,先有個印象】,此時U剛好就可以變成單位的上三角矩陣了,如下:
矩陣的PLU分解
有了這么一個思路之后,下面再來看一個認為“無法進行LU分解”的矩陣的情況就變得可以分解了,如下:
先來進行一下高斯消元,將第一行首元以下的都化為0,先將它下面的第二行元素化為0為:
接着再將第三行元素也化為0,此時為:
此時L矩陣就變換成了:
好,接下來需要處理第二行的主元了,但是發現第二行的主元為0:
很明顯按照之前LU分解的定義很明顯此時是無法對該矩陣A進行LU分解了,但是!!!對於高斯消元法其實還是可以繼續往下消元的,因為可以行與行之間進行一下位置交換,也就是將第三行跟第二行進行元素交換為:
此時就又可以愉快地進行高斯消元了,但是!!!對應的L矩陣也得進行二三行的交換呀,一交換就不滿足下三角矩陣的形態了,怎么辦呢?其實就可以用L.D.U的思想再新分解出一個矩陣出來,該矩陣只處理行交換,而不去L這個矩陣,而交換二行的變換矩陣很容易寫出來,如下:
不過還有一個小問題需要修正,由於咱們對於二三行位置進行了交換,所以相應的L這個矩陣的第二行和第三行的系數也得交換一下,變為:
所以此時對於矩陣A就化成了三個矩陣,如下:
其中P叫做置換矩陣,這又有一個新的分解法,叫PLU分解,很明顯它比矩陣的LU分解要應用要廣泛,因為LU分解要求的條件比較苛刻,因為在高斯消元的過程難免會有可能要交換行的情況出現,所以說PLU就可以解決這種問題,甚至有些數據學庫上並沒有LU分解,只有PLU分解。那是不是PLU能應對所有的矩陣的情況呢?其實是不行的,所以下面還會有另一種分解法。
矩陣的PLUP分解:
在上面已經學習了矩陣的PLU分解了,其中也談到了它並不能適用所有的矩陣,那下面來看一下不適用的一個例子:
接着開始高斯消元,發現第一行的首元已經處理好了,它下面都為0了,接下來處理第二行,發現2行及所有的位置都為0。。 此時PLU分解也失效了對吧?因為二行三行交換也沒法再進行高斯消元呀,而要想繼續進行高斯消元,需要交換列才行,也就是將第二列跟第三列進行一下交換,那問題就轉移到找一個置換矩陣能夠達到交換矩陣列的目的,初等矩陣已經達不到這個效果了,因為初等矩陣只能交換兩行的元素,回憶一下:
注意是矩陣左乘初等矩陣達到交換兩行的目的,而要實現交換矩陣的兩列是需要右乘以置換矩陣才能達到的【左乘是找不到的喲,至於為啥之后會分析】,比如:
所以此時對於矩陣A的分解又可以進一步變成這樣的形式了:
關於這種分解方式先了解一下,因為實際線性代數課本中通常都不會提到這種分解方式,所以這里就略過了。
再看矩陣的乘法:
列交換:
在上面說明矩陣的PLUP分解時用到了列交換是用右乘以置換矩陣的方式達到的:
接下來就來理解為什么右乘能達到交換矩陣的列的效果,進而再來對矩陣的乘法有一個更深刻的認識,回憶一下對於矩陣的乘法可以以列視角進行拆解,如下:
也就是由矩陣和矩陣的列向量進行相乘,而矩陣x向量又可以分解為:
對於右邊矩陣的第一個元素為1,跟左邊矩陣相乘,其實就是取出了矩陣的第一列的元素:
因為矩陣x向量的規則是:
而第二個列向量是第三個元素為1,所以跟矩陣右乘它取的就是矩陣中的第三行:
對於第三個列向量是第二個元素為1,所以矩陣右乘它取的就是矩陣中的第二行:
也就是右乘置換矩陣就能達到交換列的效果:
行交換:
明白了列交換的思想之后,對於行交換其實也類似,比如:
左乘置換矩陣既可, 其背后的思想是:
也就是用置換矩陣的每一行向量x矩陣,最終就是每次取出的矩陣的一行。
所以此上對於矩陣的乘法就可以看成兩個視角,分別為列視角和行視角:
列交換以列視角來理解:
在上面講述列交換時的對於前面的矩陣是以行視角來看待的,回憶一下:
其實也可以把它看成列視角,回憶一個之前學習矩陣x向量時也學過以列視角看待,其當時的推論是:
所以列視角來看的話就是:
基於這樣的視角,對於咱們的列交換就可以這樣來看了,如下:
也就是對於結果矩陣來說每一列的元素:
都是由它組成:
這是以列視角理解的關鍵之處,不然很容易暈,所以,咱們基於這樣的視角對於上面的式子簡單推算一下是否如結果預期:
是不是就是這個形式?
所以此時相乘每次的結果很明顯就是:
同樣的,接着拿矩陣再乘以置換矩陣的第二列,如下:
此時得到的結果矩陣的第二列則為:
剩下的那一列類似就不過多說明了, 推而廣之,咱們以列視角來看待矩陣再來乘以矩陣會發生什么?也就是下面這種形態:
先來回憶一下行視角的相乘:
而用一個簡單的式子來表示就可以:
注意對於結果矩陣中的每一個元素其實是需要進行加法的,而如果換一個視角,就是將前面的矩陣想成是一列一列的,而后面的矩陣想成是一行一行的,所以:
其中注意角標,矩陣要相乘必須滿足前面矩陣的列數=后面矩陣的行數,所以都是k個數量,此時的式子就可以這樣看了:
而最終又可以得到如下變換:
結果矩陣可以變成各個矩陣的加法,所以對於矩陣的相乘的兩個視角就回到了之前咱們學習的結論,如下:
這樣就進一步加深了對於我們之前學習矩陣乘法的理解,這些性質是為后續進一步深入學習線性代數的一個非常堅實的基礎,需要好好理解。
總結:
這次主要是對於矩陣的分解進行了學習,總共有如下幾種分解形式:
而對於矩陣的逆還有很多的等價命題,這塊才是重點,回憶一下:
因為這些命題是為后續學習更加高級的話題的一個推導命題,而且會隨着未來的不斷深入還會擴充其它很多等價命題進來,這里一定要對它們有一個感性的認識,很重要!!!