1. A = LU

之前在消元的过程中,我们看到可以将矩阵 \(A\) 变成一个上三角矩阵 \(U\),\(U\) 的对角线上就是主元。下面我们将这个过程反过来,通一个下三角矩阵 \(L\) 我们可以从 \(U\) 得到 \(A\), \(L\) 中的元素也就是乘数 \(l_{ij}\)。

如果有一个 3*3 的矩阵,假设不需要进行行交换,那我们需要三个消元矩阵 \(E_{21}, E_{31}, E_{32}\) 来分别使矩阵 \(A\) 的 (2, 1)、(3, 1) 和 (3, 2) 位置为零,然后我们就有

乘数 \(l_{ij}\) 正好就是 \(L\) 中 \((i, j)\) 处的元素。因为当我们计算 \(U\) 的第三行的时候,实际上是用 \(A\) 的第三行减去 \(U\) 的前两行的一些倍数。

因此有

下面看一个特殊的例子

如果 \(A\) 的某一行以 0 开始,说明该位置不需要进行消元,也即 \(L\) 中对应位置的元素为 0。

如果 \(A\) 的某一列以 0 开始,该位置元素在消元过程始终不会改变,也即 \(U\) 中对应位置的元素为 0。

由于 \(L\) 的对角线上都是 1,而 \(U\) 的对角线上为主元,因此,这是不对称的。我们可以进一步将 \(U\) 进行分解,使得 \(U\) 的对角线上元素也都为 1。

这时候,\(A\) 的分解就变成了 \(A = LU = LDU\),其中 \(D\) 是一个对角矩阵, \(L\) 是一个下三角矩阵, \(U\) 是一个上三角矩阵。

当我们从左边的 \(A\) 得到 \(L\) 和 \(U\) 后,我们就对右边的 \(b\) 进行同样的消元过程得到 \(Lc = b\),然后再通过回带 \(Ux=c\) 求出方程组的解。

2. 消元过程的计算复杂度

假设我们有一个 \(n*n\) 的矩阵,首先我们要将第一列主元以下的元素都变成 \(0\)。这时候,每一个元素变成 \(0\) 我们都需要 \(n\) 次乘法和 \(n\) 次减法,总共有 \(n-1\) 个元素需要变成 \(0\),总的乘法次数为 \(n(n-1)\),近似为 \(n^2\)。然后,我们要依次将后面列的主元下面的元素变成 \(0\),需要的总的乘法次数为 \(n^2+(n-1)^2+\cdots + 2 + 1 \approx \frac{1}{3}n^3\)。

也就是说对左边的 \(A\) 消元要进行 \(\frac{1}{3}n^3\) 次的乘法操作和 \(\frac{1}{3}n^3\) 次的加法操作。

再来看右边对 \(b\) 进行消元,首先我们需要将 \(b_2, b_3 \cdots b_n\) 都减去 \(b_1\),需要 \(n-1\) 次操作,往后我们依次需要 \(n-2, n-3 \cdots 1\) 次操作。回带的时候,求解最后一个方程的时候,我们只需要进行 1 次操作,依次往上我们需要 \(2, 3 \cdots n\) 次操作。因此,求解的过程总共需要 \(n^2\) 次的乘法操作和 \(n^2\) 次的加法操作

3. 转置和置换矩阵

\(A\) 的转置矩阵称为 \(A^T\),其中 \(A^T\) 的列就是 \(A\) 的行,也即 \((A^T)_{ij} = A_{ji}\)。

\[(A+B)^T = A^T + B^T\]
\[(AB)^T = B^TA^T\]

假设 \(B\) 是一个向量 \(x\),那么对 \((Ax)^T = x^TA^T\) 的理解就是:\(Ax\) 是对 \(A\) 的列的线性组合,\(x^TA^T\) 则是对 \(A^T\) 的行的线性组合,\(A\) 的列和 \(A^T\) 的行是一样的,所以线性组合后是一样的结果。

如果 \(B\) 有多列的话,我们就很容易得到

同理,针对更多的矩阵,我们也有

\[(ABC)^T = C^TB^TA^T\]

\[(A^{-1})^T = (A^T)^{-1}\]

\[AA^{-1} = I \to (AA^{-1})^T = I \to (A^{-1})^TA^T = I \to (A^{-1})^T = (A^T)^{-1}\]

转置形式的内积和外积

对称矩阵的转置等于它本身,也就是 \(A^T = A\)。而且,一个对称矩阵的逆矩阵也是对称的。

\[(A^{-1})^T = (A^T)^{-1} = A^{-1}\]

对于一个任意的矩阵 \(R\),可以是矩形的,\(R^TR\) 和 \(RR^T\) 都是一个对称的方阵。

\[(R^TR)^T = R^T(R^T)^T = R^TR\]

当 \(A=A^T\) 时,如果没有行交换,那么有 \(A = LDU = LDL^T\),此时 \(U\) 变成了 \(L^T\)

置换矩阵 \(P\) 每行每列都只有一个 1,而且 \(P^T\)、\(PP^T\) 和任意两个置换矩阵的乘积 \(P_1P_2\) 都还是置换矩阵。此外,所有的置换矩阵都有 \(P^T=P^{-1}\)。

在 \(n\) 阶的情况下,置换矩阵的总的个数为 \(n!\)。例如 2 阶置换矩阵只有 2 个,3 阶置换矩阵有 6 个。

如果在需要行交换的情况下,我们可以先引入一个置换矩阵 \(P\) 使矩阵 \(A\) 的行有正确的顺序,然后再进行消元,这样的话我们就有

\[PA=LU\]

也可以进行消元,然后再用一个矩阵 \(P_1\) 来让主元有一个正确的顺序,这样的话我们就有

\[A=L_1P_1U_1\]

如果 \(A\) 是可逆的,置换矩阵 \(P\) 将会使它的行有一个正确的顺序然后分解成 \(PA=LU\) 的形式。

获取更多精彩,请关注「seniusen」!

线性代数之——A 的 LU 分解的更多相关文章

  1. 线性代数笔记10——矩阵的LU分解

    在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积).LU分解主要应用在数值分析 ...

  2. matlab 求解线性方程组之LU分解

    线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...

  3. 矩阵分解---QR正交分解,LU分解

    相关概念: 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0 正定矩阵:如果对于所有的非零实系数向量x ,都有 x ...

  4. 矩阵LU分解分块算法实现

    本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...

  5. LU分解,Javascript代码

    ///A 为矩阵,这里写成一维数组,如 [1],[1,2,3,4] function GetLU(a) { var n = a.length;//矩阵的总数据数目 var s = Math.sqrt( ...

  6. matlab实现高斯消去法、LU分解

    朴素高斯消去法: function x = GauElim(n, A, b) if nargin < 2 for i = 1 : 1 : n for j = 1 : 1 : n A(i, j) ...

  7. LU分解(2)

    接着上次LU分解的讲解,这次给出使用不同的计算LU分解的方法,这种方法称为基于GaxPy的计算方法.这里需要了解lapapck中的一些函数.lapack中有一个函数名为gaxpy,所对应的矩阵计算公式 ...

  8. LU分解(1)

    1/6 LU 分解          LU 分解可以写成A = LU,这里的L代表下三角矩阵,U代表上三角矩阵.对应的matlab代码如下: function[L, U] =zlu(A) % ZLU ...

  9. MATLAB矩阵的LU分解及在解线性方程组中的应用

    作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 三.实验程序 五.解答(按如下顺序提交电子版) 1.(程序) (1)LU分解源程序: function [ ...

随机推荐

  1. 商业化IM 客户端接口设计分析

    对于刚接触IM(即时通讯)开发,通过阅读成熟的商业代码能够对即时通讯软件大体上有个认识,比如消息发送,消息接受,消息监听,群聊,单聊,聊天室.我这边直接拿[Gobelieve IM]源码来做剖析.IM ...

  2. Hibernate连接各种数据库的配置

    转自CSDN shl7765856的专栏:http://blog.csdn.net/shl7765856/article/details/7411987 目录: 1.MySql连接配置 2.Sql S ...

  3. input和div模仿select,带输入提示

    有时候我们需要select和input的结合体,即可以使用下拉框,同时也可以用来输入,输入的同时显示可选的下拉选项 先上html代码 <div class="input-group i ...

  4. STL笔记

    STL的基本概念: 1-容器:是可容纳各种类型的数据结构,是 类模板. 2-迭代器:是用于依次存放容器中的元素,类似指针. 3-算法: 是用于操作容器中元素的 函数模板. sort() 用来对 vec ...

  5. redhat6 快速部署percona

    1.首先得能访问外网 2.yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-relea ...

  6. tctip打赏小插件

    tctip是一个js插件,作用是在web网页右侧生成一个打赏浮动窗 使用方法 页面使用(多数人的使用方式) 插件下载地址 第一步,引入js 一般引入min版本,即引入tctip-版本号.min.js文 ...

  7. 【Hadoop故障处理】全分布下,DataNode进程正常启动,但是网页上不显示,并且DataNode节点为空

    [故障背景] DataNode进程正常启动,但是网页上不显示,并且DataNode节点为空. /etc/hosts   的ip和hostname配置正常,各个机器之间能够ping通. [日志错误信息] ...

  8. React的安装方法

    一:直接使用 BootCDN 的 React CDN 库,地址如下: <script src="https://cdn.bootcss.com/react/16.4.0/umd/rea ...

  9. 『Python基础-8』列表

    『Python基础-8』列表 1. 列表的基本概念 列表让你能够在一个地方存储成组的信息,其中可以只包含几个 元素,也可以包含数百万个元素. 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  10. 实验吧web加了料的报错注入

    知识点: SQL注入中用到的Concat函数详解    http://www.sohu.com/a/219966085_689961 http分割注入 直接根据提示,提交post请求的用户名和密码 结 ...