矩阵A的LU分解 A=LU

news/2024/12/2 22:18:25/文章来源:https://www.cnblogs.com/zzzwwwqqq/p/18582862

矩阵\(\mathbf A\)的LU分解 \(\mathbf A=\mathbf L\mathbf U\)


​ 如果已知\(\mathbf A\)\(\mathbf B\)的逆矩阵\(\mathbf A^{-1}\)\(\mathbf B^{-1}\),那么\(\mathbf{AB}\)的逆是什么?

​ 先给出结论[1]\(\mathbf{AB}\)的逆矩阵是\(\mathbf{B}^{-1}\mathbf{A}^{-1}\)。简单证明一下:\((\mathbf{AB})(\mathbf{B}^{-1}\mathbf{A}^{-1})=\mathbf I\),应用乘法结合律便可以得到这一结论。Gilbert Strang教授在他的书中做了一个形象的比喻:就好比先脱鞋子,再脱袜子,它的“逆”就是先穿袜子后穿鞋子。对于两步操作(\(\mathbf A\)\(\mathbf B\)如果右乘一个矩阵的话,自然可以理解为对这个矩阵的操作),如果想要逆运算,那么必然是先逆后一步,再前者。这一结论同样适用于三个及以上的矩阵。

​ 书归正传,那么什么是矩阵的LU分解?其中的“U”可以猜到,在之前的篇章中也有提到,是矩阵经消元之后的结果,不过并没有提到它为什么叫“U",在本篇随后会有说明。

​ 让我们回到之前讲消元矩阵的时候,以下面这个运算为例:

\[\begin{bmatrix} 1 & 0 \\ -4 & 1 \end{bmatrix} \begin{bmatrix} 2 & 1 \\ 8 & 7 \end{bmatrix} = \begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} \]

对矩阵\(\mathbf A\)\(row2 - 4row1\),即左乘\(\mathbf E_{2,1}\),得到\(\mathbf U\)。那如果想把这个等式化成类似\(\mathbf A=\mathbf L\mathbf U\)的形式,那么问题是\(\mathbf L\)是什么,即要得到

\[\begin{bmatrix} 2 & 1 \\ 8 & 7 \end{bmatrix} = \mathbf L \begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} \]

不难得出,\(\mathbf L=\begin{bmatrix}1&0\\4&1\end{bmatrix}\),而且\(\mathbf L=\mathbf E_{2,1}^{-1}\)。重新写一下

\[\begin{bmatrix} 2 & 1 \\ 8 & 7 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 4 & 1 \end{bmatrix} \begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} \]

观察到,同时把矩阵\(\mathbf A\)化成了一个下三角矩阵(lower)与一个上三角矩阵(upper)的乘积的形式,这也就是\(\mathbf L\)\(\mathbf U\)的来历。消元的目的也正是将矩阵化为上三角矩阵的形式。右式也可以表示为

\[\begin{bmatrix} 1 & 0 \\ 4 & 1 \end{bmatrix} \begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix} \begin{bmatrix} 1 & 1/2 \\ 0 & 1 \end{bmatrix} \]

其中中间的矩阵为对角矩阵,记为\(\mathbf D\)

​ 再考虑一下\(\mathbf A\)\(3\times3\)的情况。在假设没有行交换的情况下,有\(\mathbf{E}_{3,2}\mathbf{E}_{3,1}\mathbf{E}_{2,1}\mathbf{A}=\mathbf{U}\),那么就有

\[\mathbf{A}=\mathbf{E}_{2,1}^{-1}\mathbf{E}_{3,1}^{-1}\mathbf{E}_{3,2}^{-1}\mathbf{U} \]

举个例子,假设\(\mathbf{E}_{3,2}=\begin{bmatrix}1&0&0\\0&1&0\\0&-5&1\end{bmatrix}\)\(\mathbf{E}_{2,1}=\begin{bmatrix}1&0&0\\-2&1&0\\0&0&1\end{bmatrix}\),没有用到\(\mathbf{E}_{3,1}\)。那么

\[\mathbf{E}_{3,2}\mathbf{E}_{2,1}= \begin{bmatrix} 1 & 0 & 0\\ -2 & 1 & 0\\ 10 & -5 & 1 \end{bmatrix} =\mathbf{E} \]

如果按照之前对消元矩阵的理解去分析,会发现关于矩阵\(\mathbf A\)的$ row3 \(处理是\) 10row1-5row2+row3\(,这是两个运算综合起来的结果:\) row2-2row1 \(和\) row3-5row2$。如果要计算其逆矩阵,不难得出

\[\begin{bmatrix} 1 & 0 & 0\\ 2 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 5 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0\\ 2 & 1 & 0\\ 0 & 5 & 1 \end{bmatrix} =\mathbf{L} \]

​ 注意到,在\(\mathbf{L}\)中,与\(\mathbf{E}\)不同,矩阵相乘时,\(2\)\(5\)没有相互干扰得到\(10\)。因此,要想求出\(\mathbf{L}\),只需把所有消元乘数都写进来即可(实际上对\(\mathbf{E}_{3,2}\)\(\mathbf{E}_{2,1}\)的逆运算也不过是把该运算减去的数加回去而已,很容易求出来),不过这个的前提是没有行互换。

​ 关于这个结论,也不难理解,因为正运算(\(\mathbf{E}\))从上到下的消元过程,前面的步骤都会影响后续的步骤;而逆运算(\(\mathbf{L}\))是从下到上的,不会影响到上面的向量(行)。


​ 上面正文部分已结束,下面将讨论LU分解的意义,即我们为什么要做LU分解。

​ 首先说一下Gilbert Strang教授的说法。我们对一个\(n\times n\)的矩阵\(\mathbf A\),需要多少操作,得到上三角矩阵\(\mathbf U\)?假设其中没有\(0\),因为有\(0\)的话计算次数会减少,考虑最复杂的情况。

​ 如果对第一个主元做处理,让它的下面全为\(0\),即实现

\[\begin{bmatrix} \boxed{a_{0,0}} & \cdots & a_{1,n}\\ 0 & \cdots & a_{2,n}\\ \vdots & \ddots & \vdots\\ 0 & \cdots & a_{n,n} \end{bmatrix} \]

下面假设先做一次乘法再做一次减法记为一次操作(一步),那么刚才所说的得到第一主元需要\(n\times (n-1)\)步。其下同理,一共需要

\[n\times(n-1)+(n-1)\times(n-2)+\cdots+2\times1=\sum_{i=1}^{n-1}{i(i-1)} \approx\sum_{i=1}^{n-1}{i^2} \approx\dfrac{1}{3}n^3 \]

\(n\)很大时可以做这个近似。

​ 那如果只对增广矩阵最右侧\(b\)做运算的话,与之同理,需要\(\dfrac{n^2}{2}\)步。

​ 由此我们得出,对形似\(\mathbf A \mathbf x=\mathbf b\)的计算,对\(\mathbf A\)的操作的复杂度是很高的,如果提前将\(\mathbf A\)变为\(\mathbf L\mathbf U\)的形式,那么对于任意的\(b\),计算就容易多了。

​ 最后再说一下在网上找到的矩阵的LU分解的过程以及意义 - 知乎这篇文章,作者的思路也很好。

​ 假设现在有一个系统,系统内涉及到一个运算 \(\mathbf A \mathbf x=\mathbf b\) ,根据\(b\)来求取出信息\(\mathbf x\),每次都是\(b\)不相同,但是\(\mathbf A\)是固定的。这个时候我们就可以通过LU分解,预先将固定的矩阵\(\mathbf A\)分解,然后通过LU来求解\(\mathbf x\)。之所以这么做,是因为LU分解比直接求\(\mathbf x\)的效率要高。

​ 首先,看下述公式

\[\mathbf A\mathbf x=\mathbf L\mathbf U\mathbf x=\mathbf L(\mathbf U\mathbf x)=\mathbf b\\ \Rightarrow \\ \\ \mathbf L\mathbf y=\mathbf b,\text{其中}\mathbf y=\mathbf U\mathbf x \]

其第二行可以写成如下形式

\[\begin{bmatrix} l_{1,1}\\ \vdots & \ddots\\ l_{1,n} & \cdots & l_{n,n} \end{bmatrix} \begin{bmatrix} y_1\\ \vdots\\ y_n \end{bmatrix} = \begin{bmatrix} b_1\\ \vdots\\ b_n \end{bmatrix} \]

对于上面的公式,通过逐上自下的方式逐一求取未知数,其运算次数为

\[1+2+\cdots+n\approx \frac{n^2}{2} \]

这样就完成了对\(\mathbf y\)的求解。再代回求解\(\mathbf x\)

\[\begin{bmatrix} u_{1,1} & \cdots & u_{1,n}\\& \ddots & \vdots\\ & & u_{n,n} \end{bmatrix} \begin{bmatrix} x_1\\ \vdots\\ x_n \end{bmatrix} = \begin{bmatrix} y_1\\ \vdots\\ y_n \end{bmatrix} \]

其运算次数同理,为\(\dfrac{n^2}{2}\)。因此,如果矩阵\(\mathbf A\)已化为\(\mathbf L\mathbf U\)的形式,那么便可以通过以下两步完成对\(\mathbf x\)的求解:

  1. 根据\(\mathbf L\mathbf y=\mathbf b\)求解出\(\mathbf y\)
  2. 根据\(\mathbf U\mathbf x=\mathbf y\)\(\mathbf y\)代入,求解出\(\mathbf x\)

​ 因此整个过程复杂度为\(\dfrac{n^2}{2}+\dfrac{n^2}{2}=n^2\)

​ 而直接利用消元法的复杂度在之前已经求解,是\(\dfrac{n^3}{3}+\dfrac{n^2}{2}\)。显然,利用\(\mathbf L\mathbf U\)的形式复杂度更小。

​ 举个不是很恰当的例子,利用\(\mathbf A=\mathbf L\mathbf U\)\(\mathbf A\)分解的办法就好比代码编译后,根据对其输入的值能很快得到输出一样;而每次直接消元运算就像是将输入参数的值嵌入到程序中,每次运行都需要重新编译。再说一个更不恰当的例子,LU分解就得到了矩阵\(\mathbf A\)的“系统函数”,而不同的输入只需对其做相应的卷积(或乘积)即可。而且,根据正文的讨论,得到\(\mathbf{L}\)\(\mathbf{U}\)的过程其实并不麻烦,相反,比直接得到\(\mathbf{E}\)要轻松得多。


  1. 这本应是上一篇给出的,在这一篇里会用到,于是直接在这一篇开头说明了。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验5.继承和多态

1.实验任务1: publisher.hpp:#pragma once#include <iostream> #include <string>using std::cout; using std::endl; using std::string;// 发行/出版物类:Publisher (抽象类) class Publisher { public:Publisher(const string &s = ""); …

PTQ 精度 Debug 工具

01 前言 使用 PTQ 后量化的模型量化方案,可以帮助用户非常简单便捷地完成从浮点模型到地平线混合异构模型的转换,模型转换工具会基于用户提供的校准样本对模型进行校准量化并保障模型高效地部署在地平线计算平台上。 但是在模型转换的过程中,不可避免地会因为浮点高精度到定…

字符串的遍历、统计字符案例

1.两种字符串遍历方法1.toCharArray 将字符串转换成一个新的字符类型的数组 调用方式:对象.如图,其实就相当于把字符串全部拆开,变成一个个的字符,再由字符数组来接收2.charAt 根据输入的索引,从字符串里找出对应的字符 调用方法:对象. 如图如果我们要遍历字符串,那不就…

synchronized同步锁机制

目录synchronized 的使用Java的对象头和 Monitor对象头实例数据对齐填充synchronized 原理synchronized修饰代码块示例对象锁的四种状态无锁偏向锁轻量级锁重量级锁synchronized 的使用如果修饰的是具体对象:锁的是对象 如果修饰的是成员方法:那锁的就是 this 如果修饰的是静…

员工出入更衣室穿戴规范识别检测系统

员工出入更衣室穿戴规范识别检测系统能够通过安装在更衣室入口的摄像机,员工出入更衣室穿戴规范识别检测系统实时检测员工的穿戴情况。系统的工作流程如下:当员工进入更衣室时,摄像机捕捉到图像,算法迅速识别图像中的人员,并检测他们是否穿戴了规定的防护服、护目镜、口罩…

Lock接口

目录Lock接口Lock接口概述API方法锁获取与中断Synchronized和Lock的区别 Lock接口大佬地址: AQS(AbstractQueuedSynchronizer)源码深度解析(2)—Lock接口以及自定义锁的实现Lock接口概述 Lock接口同样自于JDK1.5,它被描述成JUC中的锁的超级接口,所有的JUC中的锁都会实现Lock…

作文的深度解析

目录题目一:There is a growing awareness of the importance of digital literacy and skills in todays world题目二:Nowadays more and more college students have come to realize social practice and academic learning are equally important. 题目一:There is a gr…

终极Redis

Redis是世界上最流行的数据存储之一,功能丰富。这里有8个简单的步骤可以帮助你理解Redis的基本原理。1、什么是Redis?Redis(远程字典服务器)是一个多模式数据库,提供亚毫秒级的延迟。Redis背后的核心思想是缓存也可以作为一个完整的数据库。2、Redis采用Airbnb、Uber、Sla…

AI电动车头盔识别系统解决方案

AI电动车头盔识别系统解决方案通过在关键路段及社区入口等位置安装高清摄像头,AI电动车头盔识别系统解决方案结合深度学习算法对电动车骑行者进行实时监测,确保骑行者的安全。识别到未佩戴头盔的骑行者时,AI电动车头盔识别系统解决方案将立即联动附近的智能广播系统播放预先…

H5-17 选择器

CSS语法 规则由两个主要的部分构成:选择器,以及一条或多条声明(样式) 1、全局选择器可以与任何元素匹配,优先级最低,一般做样式初始化*{margin:0;padding:0;} 2、元素选择器HTML 文档中的元素,p、b、div、a、img、body等标签选择器,选择的是页面上所有这种类型的标签…

canal的安装搭建

canal介绍主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 这里我们可以简单地把canal理解为一个用来同步增量数据的一个工具。canal能做什么数据库镜像 数据库实时备份 索引构建和实时维护 业务cache(缓存)刷新 带业务逻辑的增量数据处理首先开启mysql bi…

ctfshow 信息搜集web入门思路

做ctfshow的思路(web2)js前台拦截 无法使用f12打开代码 可以使用 ctrl+u 或者在网站前面加上view-source: 或者使用bp进行抓包(web4)robots.txt 中可能包含着信息(web5)phps源码泄露index.phps(web6)源码泄露 www.zip 泄露(web7)/.git/ 源文件泄露(web8)index.p…