线性代数之——A 的 LU 分解
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 分解的更多相关文章
- 线性代数笔记10——矩阵的LU分解
在线性代数中, LU分解(LU Decomposition)是矩阵分解的一种,可以将一个矩阵分解为一个单位下三角矩阵和一个上三角矩阵的乘积(有时是它们和一个置换矩阵的乘积).LU分解主要应用在数值分析 ...
- matlab 求解线性方程组之LU分解
线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...
- 矩阵分解---QR正交分解,LU分解
相关概念: 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0 正定矩阵:如果对于所有的非零实系数向量x ,都有 x ...
- 矩阵LU分解分块算法实现
本文主要描述实现LU分解算法过程中遇到的问题及解决方案,并给出了全部源代码. 1. 什么是LU分解? 矩阵的LU分解源于线性方程组的高斯消元过程.对于一个含有N个变量的N个线性方程组,总可以用高斯消去 ...
- LU分解,Javascript代码
///A 为矩阵,这里写成一维数组,如 [1],[1,2,3,4] function GetLU(a) { var n = a.length;//矩阵的总数据数目 var s = Math.sqrt( ...
- matlab实现高斯消去法、LU分解
朴素高斯消去法: function x = GauElim(n, A, b) if nargin < 2 for i = 1 : 1 : n for j = 1 : 1 : n A(i, j) ...
- LU分解(2)
接着上次LU分解的讲解,这次给出使用不同的计算LU分解的方法,这种方法称为基于GaxPy的计算方法.这里需要了解lapapck中的一些函数.lapack中有一个函数名为gaxpy,所对应的矩阵计算公式 ...
- LU分解(1)
1/6 LU 分解 LU 分解可以写成A = LU,这里的L代表下三角矩阵,U代表上三角矩阵.对应的matlab代码如下: function[L, U] =zlu(A) % ZLU ...
- MATLAB矩阵的LU分解及在解线性方程组中的应用
作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 三.实验程序 五.解答(按如下顺序提交电子版) 1.(程序) (1)LU分解源程序: function [ ...
随机推荐
- Hbuilder连接安卓模拟器,调试app
本人用的是夜神模拟器,所以下面的命令也是基于夜神的,其他模拟器请自行百度. 1.首先,启动HBuilder和夜神模拟器 然后打开cmd命令提示符 cd进入夜神模拟器bin目录 执行以下命令 nox_a ...
- 五、MapReduce 发布服务
是一个并行计算框架(计算的数据源比较广泛-HDFS.RDBMS.NoSQL),Hadoop的 MR模块充分利用了HDFS中所有数据节点(datanode)所在机器的内存.CUP以及少量磁盘完成对大数据 ...
- Vue--- 一点车项目 6个小时实际看了10天(完结)
一个项目 环境安装 使用了 cli 脚手架 Koa2 workpackage 其他小的不计 前端Vue组件搭建 数据的简单测试交互 数据库的设计 创建.连接接数据库 前台[表单/分类] ...
- 通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学
首发于:Aardio通过遍历JSON键值对获取包含某字符串的键的值_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=429 ...
- 算法基础-dfs
最近在学dfs(深度优先搜索),dfs与树的遍历差不多,就是先从一个点开始一直搜索,直到走不动为止.现在推荐一个简单的dfs题, 百炼的2815, ########################## ...
- 【Spark】Spark核心之弹性分布式数据集RDD
1. RDD概述 1.1 什么是RDD (1) RDD(Resilient Distributed Dataset)弹性分布式数据集,它是Spark的基本数据抽象,它代表一个不可变.可分区.里面的元素 ...
- spark exectors的启动总结
在spark启动之后,worker和master注册通信之后,在进入用户提交app中,new SparkContext之后就会在worker上分配exectors了. 首先在sparkContext中 ...
- 用树莓派3B+和 ITEAD PN532 读取、破解、写入M1卡
这是一篇介绍如何用树莓派使用PN532的随笔,介绍了具体的使用步骤. 首先介绍一下: ①.IC卡是非接触式的智能卡,里面一般是一个方形线圈和一个小芯片(用强光照着可以看到).M1卡是IC卡的一种,一般 ...
- python 两个面试题
1.下面程序的运算结果是什么?? class Parent: def func(self): print("In Parent func") def __init__(self): ...
- Java线程和多线程(十二)——线程池基础
Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务.开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池. 线程池是Java中多线程的一个重要概 ...