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. redhat5本地源NBD驱动安装

    1.将镜像挂载到本机上 1)将系统ISO镜像放到自己电脑/root下     lsb_release -a 查看系统类型 2)在(/)目录下,建立yum目录     mkdir /root/yum 3 ...

  2. 极光推送能获取 registrationId,但是接收不到通知 - iOS

    集成极光推送进行调试的时候,运行 App 可以正常获取 registrationId,但是却迟迟无法收到推送消息,而Android 端是可以正常收到消息; 检查了证书配置和极光的配置一切正常,便开始返 ...

  3. Xcode打开playground运行很慢或者无法输出的解决办法

    学习Swift最快捷的方法就是创建playground,但有时后运行很慢或者一直显示Running,无法输出. 解决办法 关闭Xcode 在终端里执行2段代码 rm -rf ~/Library/Dev ...

  4. 让 shell(bash) 命令行显示当前 git 的分支名称

    早上测试脚本的时候,偶然在这篇文章<Git – setting up a remote repository and doing an initial push>看到一个关于 git 的好 ...

  5. Linux磁盘管理和lvm

    磁盘管理 硬盘接口和硬盘种类 从整体的角度上,硬盘接口分为IDE.SATA.SCSI和SAS四种,IDE接口硬盘多用于家用产品中,也部分应用于服务器,SCSI接口的硬盘则主要应用于服务器市场,而SAS ...

  6. 10.31课程.this指向

    作用域: 浏览器给js的生存环境(栈). 作用域链: js中的关键字例如var.function...都可以提前声明,然后js由上到下逐级执行,有就使用,没有就在它的父级元素中查找.这就叫做作用域链. ...

  7. Laravel 入门笔记

    1.MVC简介 MVC全名是Model View Controller,是模型-视图-控制器的缩写 Model是应用程序中用于处理应用程序数据逻辑的部分 View是应用程序中处理数据显示的部分 Con ...

  8. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号

    由于经常要写导单和数据分析功能,所以要获取什么时间的数据,想什么当天,周,年,月之类的时间格式都很好获取.我今天在这里为大家提供的是当月每天的开始和结束的时间格式. 希望能帮到大家!!! # 获取当月 ...

  9. 【篇一】Python安装与初识

    一.python3.6安装 windows: 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右 ...

  10. print&input--Python

    1.print --> 打印到屏幕输出字符串 print("this is a dog!") -->代码 D:\Python\venv\Scripts\python.e ...