一:矩阵LU分解

矩阵的LU分解目的是将一个非奇异矩阵\(A\)分解成\(A=LU\)的形式,其中\(L\)是一个主对角线为\(1\)的下三角矩阵;\(U\)是一个上三角矩阵。

比如\(A= \begin{bmatrix}
1 & 2 & 4 \\
3 & 7 & 2 \\
2 & 3 & 3 \\
\end{bmatrix}\),我们最终要分解成如下形式:

\[A=L\cdot U =
\begin{bmatrix}
1 & 0 & 0 \\
3 & 1 & 0 \\
2 & -1 & 1 \\
\end{bmatrix}
\cdot
\begin{bmatrix}
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & 0 & -15 \\
\end{bmatrix}
\]

现在主要的问题是如何由矩阵\(A\)计算得到矩阵\(L\)和\(U\)呢?我们将在下面详细讨论。

1.1 LU分解原理

首先从矩阵\(U\)入手,因为它是一个上三角矩阵,所以很容易想到高斯消元法,依次把矩阵\(A\)主对角线左下角的元素消为\(0\)就得到\(U\)了。

然后计算矩阵\(L\),这里有个技巧,可以这样想,正是因为有了\(L\),所以\(U\)的左下部分才能被消为\(0\),所以我们记录一下把\(U\)的左下部分消为\(0\)时矩阵\(A\)每行所乘的倍数,这个减去的倍数便是\(L\)左下元素的值!

1.2 LU分解计算举例

\[A=\begin{bmatrix}
1 & 2 & 4 \\
3 & 7 & 2 \\
2 & 3 & 3 \\
\end{bmatrix}
\overset{(2)- \color{red}{3} \times (1)}{\underset{}{\to}}
\begin{bmatrix}
1 & 2 & 4 \\
0 & 1 & -10 \\
2 & 3 & 3 \\
\end{bmatrix}
\overset{(3)- \color{red}{2} \times (1)}{\underset{}{\to}}
\begin{bmatrix}
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & -1 & -5 \\
\end{bmatrix}
\overset{(3)+ \color{red}{1} \times (2)}{\underset{}{\to}}
\begin{bmatrix}
1 & 2 & 4 \\
0 & 1 & -10 \\
0 & 0 & -15 \\
\end{bmatrix}
=U
\]

在运算过程中左下相应元素减去的倍数(上面红色的数字)便是矩阵\(L\)左下角的元素,可以得到:

\[L=
\begin{bmatrix}
1 & 0 & 0 \\
\color{red}{3} & 1 & 0 \\
\color{red}{2} & \color{red}{-1} & 1 \\
\end{bmatrix}\]

1.3 计算公式总结

通用计算公式是很重要的,因为有了公式之后,编程起来就方便很多了。我们可以根据上面的推导过程整理出如下伪代码:

\[for \text{ } i = 1 : n \hspace{6cm} \\
for \text{ } j = i : n \quad此时i为行下标,j为列下标\\
\qquad U_{ij}=A_{ij}-\sum_{k=1}^{i-1} L_{ik}U_{kj} \hspace{1cm}\\
\qquad for \text{ } x = i+1 : n \quad 此时x为行下标,i为列下标\\
\qquad L_{xi}=(A_{xi}-\sum_{k=1}^{i-1} L_{xk}U_{ki}) /U_{ii} \hspace{0cm}\\
\]

其中\(n\)为方阵的行或列长度,可以看出先计算矩阵\(U\)的第一行,再计算矩阵\(L\)的第一列,再计算矩阵\(U\)的第二行,再计算矩阵\(L\)的第二列,依此类推。


二:矩阵LU分解MATLAB实现

clc,clear all,close all
% 矩阵的LU分解 %% 自己实现
A = [1 2 4;3 7 2;2 3 3]
[n,n] = size(A);
L = eye(n,n); % L初始化为单位矩阵
U = zeros(n,n); % U初始化为零矩阵 for i = 1 : n % 根据计算公式实现
for j = i : n
U(i,j) = A(i,j) - sum(L(i,1 : i - 1) .* U(1 : i - 1,j)');
end
for x = i + 1 : n
L(x,i) = (A(x,i) - sum(L(x,1 : i - 1) .* U(1 : i - 1,i)')) ./ U(i,i);
end
end
L
U
%% 内置函数实现 [L1,U1] = lu(A)

三:矩阵LU分解C++实现

#include <iostream>
#include <vector>
using namespace std; int main()
{
vector<vector<double>> a = { {1,2,4},{3,7,2},{2,3,3} };
int n = a.size();
vector<vector<double>> u(n, vector<double>(n));
vector<vector<double>> l(n, vector<double>(n)); for (int i = 0; i < n; i++) //初始化矩阵L和矩阵U
for (int j = 0; j < n; j++)
{
u[i][j] = 0;
if (i == j) l[i][j] = 1;
} for (int i = 0; i < n; i++)
{
double sum = 0;
for (int j = i; j < n; j++)
{
for (int k = 0; k <= i - 1; k++)
sum += l[i][k] * u[k][j];
u[i][j] = a[i][j] - sum; //计算矩阵U
sum = 0;
} for (int x = i + 1; x < n; x++)
{
for (int k = 0; k <= i - 1; k++)
sum += l[x][k] * u[k][i];
l[x][i] = (a[x][i] - sum) / u[i][i]; //计算矩阵L
sum = 0;
}
} cout << "A:" << endl; //输出矩阵A
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%.3f ", a[i][j]);
}
cout << endl;
} cout << "L:" << endl; //输出矩阵L
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%.3f ", l[i][j]);
}
cout << endl;
} cout << "U:" << endl; //输出矩阵U
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%.3f ", u[i][j]);
}
cout << endl;
} return 0;
}

矩阵LU分解的MATLAB与C++实现的更多相关文章

  1. 矩阵LU分解程序实现(Matlab)

    n=4;%确定需要LU分解的矩阵维数 %A=zeros(n,n); L=eye(n,n);P=eye(n,n);U=zeros(n,n);%初始化矩阵 tempU=zeros(1,n);tempP=z ...

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

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

  3. 矩阵LU分解

    有如下方程组 ,当矩阵 A 各列向量互不相关时, 方程组有位移解,可以使用消元法求解,具体如下: 使用消元矩阵将 A 变成上三角矩阵 , , 使用消元矩阵作用于向量 b,得到向量 c,, , Ax=b ...

  4. LU分解(1)

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

  5. 计算方法 -- 解线性方程组直接法(LU分解、列主元高斯消元、追赶法)

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> ...

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

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

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

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

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

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

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

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

随机推荐

  1. [leetcode/lintcode 题解] 有效回文 II · Valid Palindrome II

    [题目描述] 给一个非空字符串 s,你最多可以删除一个字符.判断是否可以把它变成回文串. 在线评测地址: https://www.lintcode.com/problem/valid-palindro ...

  2. spring时遇到的小问题

    最近在学习spring的时候遇到了两个小问题,在此总结一下 1.少导了所需要的包 运行测试程序,报出以下错误. 初步分析,得知是dataSource数据源没有创建成功,以为dataSource配置文件 ...

  3. C#设计模式之21-策略模式

    策略模式(Stragety Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/427 访问. 策略模式属于 ...

  4. 从系统报表页面导出20w条数据到本地只用了4秒,我是如何做到的

    背景 最近有个学弟找到我,跟我描述了以下场景: 他们公司内部管理系统上有很多报表,报表数据都有分页显示,浏览的时候速度还可以.但是每个报表在导出时间窗口稍微大一点的数据时,就异常缓慢,有时候多人一起导 ...

  5. Java的注解浅析

    人的一生就像一篇文章,只有经过多次精心修改,才能不断完善 Java注解概念理解: Java注解又称为Java标注,是JDK5引入的一中注释机制,Java中大家熟悉的五种注解分别是:@Override, ...

  6. [Hadoop] mapper数量的控制

    确定map任务数时依次优先参考如下几个原则: 1)      每个map任务使用的内存不超过800M,尽量在500M以下 比如处理256MB数据需要的时间为10分钟,内存为800MB,此时如果处理12 ...

  7. Clion使用gtk3

    在已经安装了gtk3的情况下,使用Clion还是无法正常给gtk3. 此时,我们需要更改CMakeList. 以下代码中需要添加的行都以#开头,此仅为了标识需要添加的行,而无需在实际代码中添加# cm ...

  8. L1-006 连续因子 天梯

    思路: 素数只有1和本身 合数 暴力枚举 把连续因子最大的记录下来 注意: AC代码 //思路: //素数只有1和本身 //合数 暴力枚举 把连续因子最大的记录下来 #include<iostr ...

  9. 【算法•日更•第二十七期】基础python

    ▎前言 看到这个题目,你一定会很好奇,为什么学打NOIP的要学习python?其实python对我们是很有用的! NOIP虽然不支持使用python提交代码,但是在NOILinux上天生自带pytho ...

  10. Spring注解驱动开发01(组件扫描使用详解)

    使用Spring注解代替XML的方式 以前都是通过xml配bean的方式来完成bean对象放入ioc容器,即使通过@Aotuwire自动装配bean,还是要创建一个xml文件,进行包扫描,显得过于繁琐 ...