线性代数之——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 [ ...
随机推荐
- 小程序内嵌H5——判断小程序环境的坑
现在各种小程序风靡,这边H5的需求还没有搞定,产品又要求做小程序版本,做可以,关键是618前上线,我-- whatever,618要做推广,日期订了,剩下的就只能是排期,定方案,尽可能完成. 最后和产 ...
- Select Sort
package com.syd.sort; /** * Description: * ClassName:SelectSort * Package:com.syd.sort * Date:2018/6 ...
- 四、MapReduce 基础
是一个并行计算框架(计算的数据源比较广泛-HDFS.RDBMS.NoSQL),Hadoop的 MR模块充分利用了HDFS中所有数据节点(datanode)所在机器的内存.CUP以及少量磁盘完成对大数据 ...
- 解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题
升级了系统 命令行不能用了 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), mis ...
- linux 安装 node 环境
本篇学习的分享主要说在linux 安装 node 环境,个人也是在腾讯云的实验室课程学习的,这里只是个人的一个学习记录, 大家也可以去腾讯的实验室来体验一下,教程十分详细易学. 1 .安装 Node. ...
- 启动pip时,< Fatal error in launcher: Unable to create process using '"' >问题的原因及解决方法
根本原因 要启动的pip程序,中指定的python程序路径不对 实例分析 我的window电脑上同时安装了python2.7和python3.6,他们的安装路径如下图: 注意图python2.7中红线 ...
- linux操作之软件安装(二)(源码安装)
源码安装 linux上的软件大部分都是c语言开发的 , 那么安装需要gcc编译程序才可以进行源码安装. yum install -y gcc #先安装gcc 安装源码需要三个步骤 1) ./confi ...
- idea配置SpringBoot热部署之自动Build
一.pom.xml文件导入所需依赖文件 SpringBoot热部署插件 <dependency> <groupId>org.springframework.boot</g ...
- java中子类会继承父类的构造方法吗?
参考: https://blog.csdn.net/wangyl_gain/article/details/49366505
- lr中常用函数以str开头函数
对各函数的定义: strcat( ):添加一个字符串到另一个字符串的末尾.strncat (拼接指定长度字符串) --粘贴操作 ...