• 线性代数学习之初等矩阵和矩阵的可逆性


    求解矩阵的逆:

    接着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个数量,此时的式子就可以这样看了:

    而最终又可以得到如下变换:

    结果矩阵可以变成各个矩阵的加法,所以对于矩阵的相乘的两个视角就回到了之前咱们学习的结论,如下:

    这样就进一步加深了对于我们之前学习矩阵乘法的理解,这些性质是为后续进一步深入学习线性代数的一个非常坚实的基础,需要好好理解。

    总结:

     这次主要是对于矩阵的分解进行了学习,总共有如下几种分解形式:

    而对于矩阵的逆还有很多的等价命题,这块才是重点,回忆一下:

     

    因为这些命题是为后续学习更加高级的话题的一个推导命题,而且会随着未来的不断深入还会扩充其它很多等价命题进来,这里一定要对它们有一个感性的认识,很重要!!!

  • 相关阅读:
    QT获取句柄
    java多线程关键字volatile、lock、synchronized
    Java几种常见的设计模式
    将博客搬至CSDN
    0228-0308的笔记
    深入理解es6-Promise对象
    彻底理解正则
    es6学习笔记-class之继承
    es6学习笔记-class之一概念
    arguments对象详解
  • 原文地址:https://www.cnblogs.com/webor2006/p/14306045.html
Copyright © 2020-2023  润新知