基于Matlab 的 n阶非奇异方阵的LU分解实现
matlab奇异值分解应用案例
![matlab奇异值分解应用案例](https://img.taocdn.com/s3/m/608ede33a517866fb84ae45c3b3567ec102ddcbb.png)
一、概述Matlab是一种用于数学计算和数据可视化的高级编程语言和环境,被广泛应用于工程、科学和商业领域。
在Matlab中,奇异值分解(Singular Value Dposition,简称SVD)是一种常用的矩阵分解方法,可以用于解决多种实际问题。
本文将介绍Matlab奇异值分解的基本原理和应用案例。
二、奇异值分解的基本原理1.1 奇异值分解的概念奇异值分解是将一个矩阵分解为三个矩阵的乘积的过程,其数学表达式为:A = UΣV^T,其中A是一个m×n的矩阵,U是一个m×m的正交矩阵,Σ是一个m×n的对角矩阵,V^T是一个n×n的正交矩阵。
奇异值分解的主要思想是将原始矩阵A分解为两个正交矩阵U和V^T 以及一个对角矩阵Σ的乘积。
奇异值分解在数据压缩、特征提取、线性回归等领域具有广泛的应用。
1.2 奇异值分解的计算方法在Matlab中,可以使用svd函数来对矩阵进行奇异值分解。
svd函数的语法为:[U, S, V] = svd(A),其中A是待分解的矩阵,U、S和V 分别是奇异值分解的结果。
1.3 奇异值分解的应用范围奇异值分解可以应用于图像处理、信号处理、推荐系统、主成分分析等各种领域。
在实际应用中,奇异值分解通常用于降维、矩阵逆的计算、矩阵的伪逆计算等问题。
下面将介绍几个Matlab中奇异值分解的应用案例。
三、奇异值分解在图像处理中的应用2.1 图像压缩奇异值分解可以用于图像的压缩和恢复。
将图像矩阵进行奇异值分解,然后只保留部分奇异值,舍弃较小的奇异值,最后根据部分奇异值重构图像。
通过这种方式,可以实现图像的压缩和恢复,减少存储空间同时保持图像质量。
2.2 图像去噪奇异值分解可以用于图像的去噪。
对含有噪声的图像进行奇异值分解,然后将奇异值进行阈值处理,去除噪声干扰,最后根据处理后的奇异值重构图像。
这种方法能够在一定程度上减少图像中的噪声,提高图像的质量。
数值分析(06)矩阵分解法
![数值分析(06)矩阵分解法](https://img.taocdn.com/s3/m/ba55122676c66137ee0619ca.png)
(1) a11
( i k 1, , n) ( i k 1, , n;
(1) a12 ( 2) a 22 (1) a13 ( 2) a 23 ( 3) a 33
数值分析
LU分解的MATLAB程序 function A=lud(A) i k 1, , n %功能:对方阵A作三角分解A=LU,其中, (k ) (k ) % L为单位下三角阵, (1)m / akk U为上三角阵, ik aik %输入:方阵 A 。 (k 1) (k ) (k ) ( 2)aij aij mik akj ,j k 1, % 输出:紧凑存储 A=[L\U]. [n,n]=size(A); % 确定A的维数 for k=1:n-1 if A(k,k) ==0 break; end for i=k+1:n A(i,k) =A(i,k)/ A(k,k); A(i,k+1:n)= A(i,k+1:n)- A(i,k) *A(k,k+1:n); end end
1
(1) (1) a a 11 12 0 a ( 2) 22 0 a ( 2) n2 1 (1) a1, n ( 2) a2, n ( 3) a3,n A( 3) mi 2 ( 3) an ,n
(2)
... ... ...
其中分别是单位下上三角阵是对角定理矩阵分解定理数值分析数值分析非奇异知均非奇异而左边是单位下三角阵同时右边是对角阵故只能是单位阵而左边是下三角阵同时右边是单位上三角阵故只能是单位阵数值分析数值分析为对称正定阵则可唯一地分定理其中称正定分解三角阵
Matlab_中的矩阵分解函数
![Matlab_中的矩阵分解函数](https://img.taocdn.com/s3/m/9542efcb89eb172ded63b771.png)
Matlab 中的矩阵分解函数矩阵分解是指根据一定的原理用某种算法将一个矩阵分解成若干个矩阵的乘积。
常见的矩阵分解有LU分解(三角分解)、QR分解(正交变换)、Cholesky分解,以及Schur分解、Hessenberg分解、奇异分解等。
(1) LU分解(三角分解)lu函数[L,U]=lu(X):产生一个上三角阵U和一个变换形式的下三角阵L(行交换),使之满足X=LU。
注意,这里的矩阵X必须是方阵。
实现LU分解后,线性方程组Ax=b的解x=U\(L\b)或x=U\(L\Pb),这样可以大大提高运算速度。
[L,U,P]=lu(X):产生一个上三角阵U和一个下三角阵L以及一个置换矩阵P,使之满足PX=LU。
当然矩阵X同样必须是方阵。
(设P 是一个m×n的(0,1) 矩阵,如m≤n且P*P′=E,则称P为一个m×n的置换矩阵。
)例1用LU分解求解例1中的线性方程组。
命令如下:A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];b=[13,-9,6,0]';x=U\(L\b)或采用LU分解的第2种格式,命令如下:[L,U ,P]=lu(A);x=U\(L\P*b)(2) QR分解(正交变换)对矩阵X进行QR分解,就是把X分解为一个正交矩阵Q和一个上三角矩阵R的乘积形式。
QR分解只能对方阵进行。
MATLAB的函数qr可用于对矩阵进行QR分解,其调用格式为:[Q,R]=qr(X):产生一个一个正交矩阵Q和一个上三角矩阵R,使之满足X=QR。
[Q,R,E]=qr(X):产生一个一个正交矩阵Q、一个上三角矩阵R以及一个置换矩阵E,使之满足XE=QR。
实现QR分解后,线性方程组Ax=b的解x=R\(Q\b)或x=E(R\(Q\b))。
例2用QR分解求解例1中的线性方程组。
命令如下:A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];b=[13,-9,6,0]';x=R\(Q\b)或采用QR分解的第2种格式,命令如下:[Q,R,E]=qr(A);x=E*(R\(Q\b))(3) Cholesky分解如果矩阵X是对称正定的,则Cholesky分解将矩阵X分解成一个下三角矩阵和上三角矩阵的乘积。
matlab 矩阵分解
![matlab 矩阵分解](https://img.taocdn.com/s3/m/39a6a54fa517866fb84ae45c3b3567ec102ddc97.png)
Matlab矩阵分解矩阵分解是一种将一个矩阵表示为其他矩阵乘积的方法。
在数学和计算机科学领域中,矩阵分解是一种重要的技术,它在很多应用中都有广泛的应用,如数据压缩、图像处理、推荐系统等。
在Matlab中,矩阵分解是一个强大而灵活的工具,可以用于解决各种实际问题。
1. 矩阵分解的概念和原理矩阵分解是将一个矩阵表示为多个小矩阵的乘积的过程。
常见的矩阵分解方法有奇异值分解(Singular Value Decomposition, SVD)、QR分解、LU分解等。
这些方法可以将一个矩阵分解为可解释性更强的形式,从而方便我们进行进一步的分析和计算。
1.1 奇异值分解(SVD)奇异值分解是矩阵分解中最常用的方法之一。
对于一个m行n列的矩阵A,奇异值分解将其分解为以下形式:A = U * S * V’其中U是一个m行m列的酉矩阵,S是一个m行n列的对角矩阵,其对角线上的元素称为奇异值,V是一个n行n列的酉矩阵。
奇异值分解的一个重要性质是,矩阵A的秩等于其奇异值的个数。
1.2 QR分解QR分解是将一个矩阵分解为一个正交矩阵和一个上三角矩阵的过程。
对于一个m 行n列的矩阵A,QR分解将其分解为以下形式:A = QR其中Q是一个m行m列的正交矩阵,R是一个m行n列的上三角矩阵。
QR分解的一个重要性质是,如果A的列向量线性无关,则R是非奇异的。
1.3 LU分解LU分解是将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的过程。
对于一个n 阶矩阵A,LU分解将其分解为以下形式:A = LU其中L是一个n阶下三角矩阵,U是一个n阶上三角矩阵。
LU分解的一个重要性质是,如果A的所有主子式都非零,则LU分解存在且唯一。
2. Matlab中的矩阵分解函数Matlab提供了丰富的矩阵分解函数,可以方便地进行矩阵分解操作。
下面介绍几个常用的矩阵分解函数及其用法。
2.1 svd函数svd函数用于进行奇异值分解。
其基本语法如下:[U, S, V] = svd(A)其中A是待分解的矩阵,U、S、V分别是奇异值分解的结果。
如何在MATLAB中实现奇异值分解(五)
![如何在MATLAB中实现奇异值分解(五)](https://img.taocdn.com/s3/m/11ea6c70effdc8d376eeaeaad1f34693dbef1045.png)
在MATLAB中实现奇异值分解(Singular Value Decomposition,SVD)是一个重要的数学问题,在信号处理、统计学和机器学习等领域有着广泛的应用。
SVD可以将一个矩阵分解为三个矩阵的乘积,从而能够提取出矩阵的重要特征,并用于数据降维、矩阵逆、矩阵近似等问题。
在本文中,我们将介绍如何在MATLAB中实现SVD,并讨论一些应用案例。
首先,我们需要了解SVD的数学定义。
对于一个实数域上的m×n矩阵A,它的SVD可以表示为:A = UΣV'其中U和V分别是m×m和n×n的正交矩阵,Σ是一个m×n的对角矩阵。
在MATLAB中,我们可以使用svd函数来实现SVD分解:[U, S, V] = svd(A);其中U、S和V分别对应SVD分解中的U、Σ和V。
这里需要注意的是,MATLAB中的svd函数返回的S是一个对角矩阵,而不是一个对角元素组成的向量。
如果我们想要得到对角元素组成的向量,可以使用diag函数:s = diag(S);接下来,我们可以利用SVD分解来进行一些有趣的应用。
例如,在信号处理中,SVD可以用于音频和图像的压缩和去噪。
对于一个音频信号,我们可以将其表示为一个矩阵,然后对这个矩阵进行SVD分解,保留其中的前几个奇异值和对应的左右奇异向量,然后利用这些信息来重建原始信号,从而达到压缩和去噪的效果。
另外,SVD还可以用于矩阵逆的计算。
对于一个非奇异矩阵A,它的逆可以表示为:A⁻¹ = VΣ⁻¹U'其中Σ⁻¹是Σ的逆矩阵。
利用SVD分解,我们可以很容易地计算出A的逆矩阵。
在MATLAB中,可以使用pinv函数来求解矩阵的伪逆:A_inv = pinv(A);除此之外,SVD还可以用于矩阵近似。
对于一个给定的矩阵A,我们可以对其进行SVD分解,并且只保留其中的前k个奇异值和对应的左右奇异向量,从而得到A的一个低秩近似。
基于Matlab的数值分析实验的设计r——以矩阵的奇异值分解为例
![基于Matlab的数值分析实验的设计r——以矩阵的奇异值分解为例](https://img.taocdn.com/s3/m/c6231a08b6360b4c2e3f5727a5e9856a561226bf.png)
基于Matlab的数值分析实验的设计r——以矩阵的奇异值分解为例杨海涛【摘要】基于Matlab的数学实验,目的是为了提高普通高校学生的数学兴趣和动手能力,为培养解决实际数学问题的能力而设计的实验方法和步骤.利用矩阵的奇异值分解svd函数的数值算法设计了一种在实验课上用svd算法仿真的实验方案.【期刊名称】《内蒙古民族大学学报(自然科学版)》【年(卷),期】2016(031)006【总页数】4页(P465-468)【关键词】数学实验;数值计算;Matlab;奇异值分解【作者】杨海涛【作者单位】内蒙古民族大学数学学院,内蒙古通辽 028043【正文语种】中文【中图分类】O241.4利用计算机计算解决实际问题时需要建立数学模型,同时也需要相应数学软件的支持,为了更好的掌握数学软件这一有利的工具,本文通过Matlab中的矩阵的奇异值分解〔1〕svd函数设计了如何学习和掌握该函数的实验方法,从而可以进一步学习其它函数.目前,Matlab在计算仿真和图形图像的压缩处理〔2~4〕有着广泛的应用,希望这个实验方法能够给正在学习数学软件的学生起到抛砖引玉的作用.1.1 理论基础任意复长方矩阵的奇异值分解定理如下(Autonne-Eckart-Young定理):〔5〕设A为一个m×n的实矩阵(m≥n),则存在正交矩阵V和U,使得:其中∑=diag(σ1,σ2,…,σr),而且σ1≥σ2≥…≥σr≥0.奇异值分解在统计分析、信号与图像处理、系统理论和控制中有着广泛的应用. 1.2 SVD的数值算法〔6〕求解一般矩阵奇异值问题最常用的算法可分为两大类:一类是QR分解的方法;另一类是Jacobi旋转的方法.奇异值分解的QR分解法分为两个阶段:一是矩阵的二重对角化,即利用Householder变换把矩阵A变换成二重对角矩阵.这个过程就是追赶(chasing)过程〔7〕.二是QR分解,即保持二重对角矩阵形式不变,利用正交变换使对角线元素逐渐减小,使得矩阵接近对角矩阵.1.2.1 svd函数.对于matlab中的svd函数不是开源的,但通过调研得知该函数的算法就是采用propack中的lansvd函数的算法.其算法过程如下:对于任意的矩阵Am×n可以利用lanczos过程将其双对角化,即存在m阶正交矩阵Q和n阶正交矩阵W满足:其中为一双对角阵,且αi, βi∈R (i=1, 2, …, n),这里假设了m>n.上面的分解是逐步的利用Householder左右变换得到的.算法中利用了已知函数完成的双对角化过程.这里如果我们已经知道Bn的svd分解为其中Vn+1为n+1阶正交矩阵,的广义对角矩阵Un为n阶正交矩阵.则有令V=Qn+1Vn+1,其前r列为对应的左奇异向量,令U=WUn,其前r列为对应的右奇异向量.因此算法的关键在于计算矩阵Bn的svd分解.因为Bn是一个双对角矩阵,它的奇异值分解计算比较简单,运算量较小,利用Givens变换,算法复杂度仅为O(n).在我们这个程序中,直接调用了库函数svd 计算Bn的奇异值.1.2.2 svds函数.对于matlab中的svds函数,算法流程如下:(1)对于m×n阶矩阵A,构造(m+n)×(m+n)阶矩阵,其中O是稀疏矩阵. (2)利用eigs函数计算出B矩阵的特征值矩阵D,以及D对应的正交阵W. (3)根据输入参数,按要求输出最大特征值、最接近某参数的特征值或对特征值进行排序等.(4)根据设定的阀值,对矩阵进行筛选得到U矩阵,对矩阵筛选得到V矩阵,对D矩阵进行筛选得到S矩阵.(5)根据S中元素的大小对U、V、S进行排序.(6)输出结果.有如下J-W定理(Jordan-Wielandt定理):若σ1≥σ2≥…≥σp-1≥σp是矩阵Am×n的奇异值(其中,p=min{m,n}),则上述B矩阵具有2p个非零特征值-σ1,…,-σp,σp,…,σ1和|m-n|个零特征值,与非零特征值(±σj)相对应的特征向量为若m≠n,另有特征向量分别对应于m>n或m<n.svds函数的基本思想就是构造出这样的矩阵B,并且求出其特征值和特征向量,然后根据函数重构的条件(所需奇异值的数量、最大最小等),求出所需的奇异值和对应的向量.2.1 矩阵生成生成10个不同的m×n的矩阵,这里取m=120 , n=50,对这10个矩阵进行svd分解.矩阵生成的方法是先做出矩阵的奇异值,然后用QR分解做出10个120阶正交阵和10个50阶正交阵,再利用奇异值分解公式生成10个矩阵A.10个矩阵的奇异值(均为25个)如表1所示.2.2 仿真结果2.2.1 计算时间svd和svds两种方法对十个矩阵进行奇异值分解消耗的时间如表2,单位是秒.可见,svd函数运行时间一般要小于svds函数运行时间.2.2.2 最小奇异值计算准确率.通过对比最小特征值的计算准确度,将每种算法特征值的最小值与矩阵最开始生成时的最小特征值进行比较.比较结果两种方法对10个矩阵的svd分解运算最小特征值的误差均几乎为0,都在10-15次方的量级左右,见表3.其中delta_min_svd和delta_min_svds是matlab程序中两个变量值.这个误差已经和截断误差非常接近了,因此可以认为两种方法都能较好的进行奇异值计算.2.2.3 左右奇异值向量计算准确率.由于svd分解后U、V矩阵的不唯一性,这里我们只看生成的U、V的正交性是不是依然比较完好.通过计算每一列和它的转置相乘减去单位阵也都在10-15这样的量级,因此svd和svds对于正交性的保持都是非常好的.综上所述,通过上述设计的方法和步骤,完全可以掌握matlab中的M-文件和.mat文件的使用方法,并且能熟练掌握奇异值分解的理论知识和具体计算方法,才能为以后svd应用打下基础,这样的实验方法才有实际的意义,才是真正的综合设计实验.本文的宗旨在于引导学生如何用数学软件完成一个实验设计,同时掌握这个实验的目的、相关内容实验的方法和手段.〔1〕尹芳黎,杨雁莹,王传栋,等.矩阵奇异值分解及其在高维数据处理中的应用〔J〕.数学的实践与认识,2011,45(15): 171-176.〔2〕胡乡峰,卫金茂.基于奇异值分解(SVD)的图像压缩〔J〕.东北师大学报:自然科学版,2006,38(3):36-39.〔3〕曾超,张陈,徐永利.基于奇异值分解的图像压缩及其matlab实现〔J〕.科技信息,2010,14:484.〔4〕向培素.一种自适应AP算法的matlab实现〔J〕.西南民族大学学报:自然科学版,2014,40(16):877-882.〔5〕张贤达.矩阵分析与应用〔M〕.北京:清华大学出版社,2004.358-360. 〔6〕姜健飞,胡良剑,唐俭.数值分析及其matlab实验〔M〕.北京:科学出版社,2004.6,219-224.〔7〕山晓东,李园.一类不可约L-矩阵的预条件AOR迭代法〔J〕.湖北民族学院学报:自然科学版,2014,32(2):128-132.。
矩阵的五种分解的matlab实现
![矩阵的五种分解的matlab实现](https://img.taocdn.com/s3/m/65adef007dd184254b35eefdc8d376eeaeaa1799.png)
矩阵的五种分解的matlab实现由于这学期修了矩阵分析这门课,课程要求⽤matlab实现矩阵的5种分解,仅仅是实现了分解,上传到博客存档,万⼀哪天某位同学就需要了呢。
1.矩阵的满秩分解代码实现1 %矩阵的满秩分解2 clear3 %设输⼊矩阵为M(P152 例4.1.1)4 A = [1,4,-1,5,6;5 2,0,0,0,-14;6 -1,2,-4,0,1;7 2,6,-5,5,-7]8 A1 = rref(A); %将矩阵A化成⾏最简形式保存在A1中9 [m,n]=size(A); %获取矩阵A的⼤⼩:m⾏n列10 B0= [];%⽣成⼀个空向量11 C0= [];%⽣成⼀个空向量12for i=1:m %依次扫描矩阵m⾏13 flag=1;14for j=1:n %依次扫描矩阵n列15if A1(i,j)==1 %若A1(i, j)等于116for k=1:i-1 %固定j列,扫描此列的第1⾏到i-1⾏元素17if A1(k,j)~=0 %判断是否全为018 flag=0; %若不全为0,则将flag置为0(说明此列不是单位矩阵的列)19break;20 end21 end22for k=i+1:m %固定j列,扫描此列的第i+1⾏到m⾏(即最后⼀⾏)元素23if A1(k,j)~=0 %判断是否全为024 flag=0; %若不全为0,则将flag置为0(说明此列不是单位矩阵的列)25break;26 end27 end28if flag==1 %若flag为1(不为0),则说明此列是【矩阵的⾏最简形式矩阵】的单位矩阵的列29 B0=[B0,A(:,j)]; %将矩阵A的j列加到B0列向量之后30 C0=[C0;A1(i,:)]; %将矩阵A1的i⾏加到C0⾏向量之后,31 end32 end33 end34 end35 [m1,n1]=size(B0); %获取矩阵B0的⼤⼩:m1⾏n1列36 [m2,n2]=size(C0); %获取矩阵C0的⼤⼩:m2⾏n2列37 B=B0(:,1:n1) %将矩阵B0的第1列到最后⼀列赋值给矩阵B38 C=C0(1:m2,:) %将矩阵C0的第1⾏到最后⼀⾏赋值给矩阵C39 %验证:BC=A40 A_1= B*C2.矩阵的正交三⾓分解代码实现直接调⽤matlab⾃带qr()函数即可1 %矩阵的正交三⾓分解2 clear;3 A = [-3,1,-2;1,1,1;1,-1,0;1,-1,1]4 [Q, R] = qr(A) %正交三⾓分解,Q为⾣矩阵,R为正交下三⾓矩阵5 %验证:QR是否为A,以及Q是否为⾣矩阵6 A_1 = Q * R7 Q_1 = Q * conj(Q.')3.矩阵的奇异值分解代码实现1 %矩阵的奇异值分解2 clear,clc3 A = [1,1;0,0;1,1];4 [U,S,V] = svd(A) %返回⼀个与A同⼤⼩的对⾓矩阵S,两个⾣矩阵U和V,且满⾜A= U*S*V~H。
lu分解matlab代码
![lu分解matlab代码](https://img.taocdn.com/s3/m/9a47d9e3cf2f0066f5335a8102d276a2002960d0.png)
LU分解(LU Decomposition)及其在Matlab中的实现1. 介绍LU分解是一种矩阵分解的方法,用于将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积。
这种分解可以帮助我们更容易地求解线性方程组、计算矩阵的行列式和逆矩阵等操作。
在Matlab中,LU分解可以通过调用内置函数lu来实现。
本文将详细介绍LU分解的原理、应用以及如何使用Matlab进行LU分解。
2. LU分解原理给定一个n×n的方阵A,我们想要将其分解为两个矩阵L和U的乘积,其中L是一个下三角矩阵,U是一个上三角矩阵。
LU分解的原理是通过高斯消元法来实现。
具体步骤如下: 1. 初始化L为单位下三角矩阵,U为A。
2. 对U应用高斯消元法,将U转换为上三角形式。
在每一步消元过程中,我们需要更新L和U的元素。
3. 最终得到L和U两个矩阵,它们满足A = LU。
3. LU分解应用3.1 求解线性方程组LU分解可以帮助我们更快速地求解线性方程组Ax = b,其中A是系数矩阵,b是常数向量。
假设我们已经得到了LU分解后的L和U矩阵,那么我们可以通过以下步骤求解线性方程组: 1. 解Ly = b得到中间变量y。
2. 解Ux = y得到最终结果x。
这种方法比直接使用高斯消元法求解线性方程组更高效,尤其对于需要多次求解不同的常数向量b的情况下。
3.2 计算行列式和逆矩阵LU分解也可以用于计算矩阵的行列式和逆矩阵。
对于一个n×n的方阵A,其行列式可以通过L和U的对角元素相乘得到。
即det(A) = det(L) × det(U) = ∏(U(i,i)),其中i从1到n。
而逆矩阵可以通过以下步骤得到: 1. 对单位下三角矩阵L应用前代法(forward substitution),得到中间结果y。
2. 对上三角矩阵U应用回代法(backward substitution),得到最终结果x。
3. 最终结果x即为A的逆矩阵。
matlab的lu分解
![matlab的lu分解](https://img.taocdn.com/s3/m/f41742702f3f5727a5e9856a561252d380eb200c.png)
matlab的lu分解(实用版)目录1.MATLAB 的 LU 分解简介2.LU 分解的算法原理3.MATLAB 中进行 LU 分解的方法4.LU 分解的应用示例5.总结正文一、MATLAB 的 LU 分解简介LU 分解(LU Factorization)是一种常见的线性代数方法,用于将一个给定的矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积。
这种分解方法在求解线性方程组、矩阵的特征值和特征向量等问题中具有广泛的应用。
MATLAB(Matrix Laboratory)是一款强大的数学软件,提供了丰富的矩阵操作和线性代数计算功能,其中就包括 LU 分解。
二、LU 分解的算法原理LU 分解的核心思想是高斯消元法,其基本步骤如下:1.对矩阵进行初等行变换,化为行最简阶梯形矩阵。
2.对阶梯形矩阵进行高斯消元,得到一个下三角矩阵和一个上三角矩阵。
3.将下三角矩阵和上三角矩阵组合成一个 LU 分解矩阵。
三、MATLAB 中进行 LU 分解的方法在 MATLAB 中,可以使用`lu`函数进行 LU 分解。
以下是一个简单的示例:```matlab% 定义一个矩阵 AA = [1 2 3; 4 5 6; 7 8 9];% 对矩阵 A 进行 LU 分解[L, U] = lu(A);% 输出 LU 分解结果disp("LU 分解结果:");disp(L);disp(U);```四、LU 分解的应用示例LU 分解在求解线性方程组方面具有广泛的应用。
例如,给定线性方程组:```AX = B```其中 A 是系数矩阵,X 是待求解的变量向量,B 是常数项向量。
可以通过 LU 分解求解该线性方程组。
具体步骤如下:1.对系数矩阵 A 进行 LU 分解,得到分解矩阵 L 和 U。
2.计算 U 的逆矩阵 U^-1。
3.将线性方程组改写为:```LUX = B```4.求解得到:```X = U^-1B```五、总结MATLAB 的 LU 分解功能为线性代数计算提供了极大的便利,可以帮助用户轻松地解决许多实际问题。
lu分解matlab代码
![lu分解matlab代码](https://img.taocdn.com/s3/m/3807ca46f342336c1eb91a37f111f18583d00c35.png)
lu分解matlab代码一、什么是LU分解?LU分解是一种矩阵分解的方法,将一个矩阵分解为一个下三角矩阵L 和一个上三角矩阵U的乘积。
这个过程可以用来求解线性方程组,也可以用来计算矩阵的行列式和逆矩阵等。
二、为什么要进行LU分解?在求解大规模线性方程组时,直接使用高斯消元法计算比较困难,因此需要采用更高效的方法。
LU分解就是一种更高效的方法,在求解线性方程组时可以减少计算量。
三、如何进行LU分解?1. 假设有一个n x n的矩阵A,我们要将其分解为L和U两个矩阵的乘积。
2. 首先,将A中第一行除以A(1,1),得到一个系数k1。
然后将这个系数乘以第一行,并减去原来的第一行,得到新的第一行。
这样就可以把A变成一个新的矩阵B。
3. 接下来,将B中第二行除以B(2,2),得到系数k2。
然后将这个系数乘以第二行,并减去原来的第二行和k1倍的第一行,得到新的第二行。
这样就可以得到一个新的矩阵C。
4. 重复上述步骤,直到得到一个n x n的上三角矩阵U。
此时,每次操作所得到的系数k1、k2、...、kn就是下三角矩阵L中对应位置的值。
5. 最后,将L和U相乘即可得到原始矩阵A。
四、如何用MATLAB实现LU分解?在MATLAB中,可以使用lu函数来进行LU分解。
以下是一个示例代码:A = [1 2 3; 4 5 6; 7 8 9];[L, U] = lu(A);其中,A是待分解的矩阵,L和U分别是分解后的下三角矩阵和上三角矩阵。
五、如何求解线性方程组?在进行了LU分解之后,我们可以使用L和U来求解线性方程组Ax=b。
以下是一个示例代码:A = [1 2 3; 4 5 6; 7 8 9];b = [1;2;3];[L, U] = lu(A);y = L\b;x = U\y;其中,b是待求解的向量,y和x分别是通过L和U求出来的中间向量和最终结果。
六、总结通过LU分解可以将一个矩阵分解为下三角矩阵和上三角矩阵的乘积,从而可以更高效地求解线性方程组。
LU分解MatLab算法分析
![LU分解MatLab算法分析](https://img.taocdn.com/s3/m/cd29be0114791711cc791757.png)
最近矩阵分析老师出了一道题目作为作业,是一道程序题,题目是对A矩阵做LU分解,要求能对A实现PA=LU的分解,并最终输出L,U,P矩阵。
先来解读下题目,寥寥几句话,里面囊括的信息量却不少,然后这些都得自己去琢磨。
首先对A矩阵能做LU分解,即能把A分解成这种形式A=L*U(U是上三角矩阵,是由A矩阵经过高斯消元后得到的,L是下三角矩阵,其对角线全为1,其他非零元素为在消去(i,j)位置元素过程中主元所乘的系数),条件有3,一是矩阵A必须为方阵,A如果不是方阵,就不要想着对它做LU分解啦,这是基本条件,牢记啊!二是矩阵A必须可逆,换种说法就是A必须为非奇异矩阵,这两种说法是等价的,而这又等价于A是满秩的,A是满秩又等价于A的行列式值非0,好绕,矩阵就是这样,很多定理其实是等价的,但是你得记住,不然在推导一些定理或公式的时候会犯一些基本的常识性错误。
三是矩阵A在高斯消元过程中必须没有出现0主元,也就是说只有在对A进行高斯消元过程中没有出现进行交换这种情况下,A才能分解成L*U这种形式,如果对A进行高斯消元,中间某一步出现0主元,需要进行行交换了,这种情况下就不要想对A进行LU分解啦,因为不满足条件3啊!那么问题来了,假如出现了有0主元这种情况,我又想对A进行LU分解,那应该怎么办?这就引出了带行变换的LU分解,也就是本文的主题。
根据书上的定理,对任意一个非奇异矩阵(等价于可逆矩阵)都存在一个置换矩阵P使得P*A可以分解成L*U这种形式,即PA=LU。
想想其实这定理也是不言自明的,刚才A不是要进行行变换才能继续高斯消元吗?而LU分解前提又是高斯消元过程中不能出现行交换,那好,我事先对A矩阵在高斯消元过程中需要交换的行给交换掉,形成一个新的矩阵B,那我对B高斯消元那肯定就不会出现需要行交换的情况,这就满足了LU分解第三个条件了,这样B不就可以进行LU分解了吗?是的,PA=LU这种形式的LU分解采用的就是这种思想。
matlab求解线性方程组之LU分解
![matlab求解线性方程组之LU分解](https://img.taocdn.com/s3/m/c4a97f68178884868762caaedd3383c4bb4cb493.png)
matlab求解线性⽅程组之LU分解线性代数中的⼀个核⼼思想就是矩阵分解,既将⼀个复杂的矩阵分解为更简单的矩阵的乘积。
常见的有如下分解:LU分解:A=LU,A是m×n矩阵,L是m×m下三⾓矩阵,U是m×n阶梯形矩阵QR分解:秩分解:A=CD , A是m×n矩阵,C是m×4矩阵,D是4×n矩阵。
奇异值分解:A=UDV T谱分解:在求解线性⽅程组中,⼀个核⼼的问题就是矩阵的LU分解,我们将⼀个矩阵A分解为两个更加简单的矩阵的复合LU,其中L是下三⾓矩阵,U是阶梯形矩阵。
下三⾓矩阵和上三⾓矩阵具有⾮常良好的性质:Lx=y 或者Ux=y 很容易求解。
问题1.对于任意的矩阵A,是否存在LU分解?定理:如果A⾏等价于阶梯形矩阵U,那么(E n E n-1......E1)A=U,其中的E i,i=1,2,.....,n是⾼斯消去矩阵,他们都是下三⾓矩阵,并且都可逆。
这个定理告诉我们三件事:1.并不是所有的矩阵都有LU分解的。
2.A=LU=(E n E n-1......E1)-1U=(E1-1E2-1.....E n-1)U。
3.这个定理还给出了求解矩阵A-1的⼀种⽅法。
数值算法1.Gauss消去⽤Gauss消去法将矩阵A⾏变换为U:⽤Gauss消去矩阵将A⾏变换为U:数值算法2.Gauss-jardon过程和Gauss-jardon基本⼀致,之不多在选择完最⼤元之后,将其化为1,这样就可以通过乘以⼀个倍数来消去其他⾏了。
选择主元当对某⼀列进⾏Gauss消去时,⼀般都是选择这⼀列中绝对值最⼤的⼀个元素作为主元,当然这会进⾏⾏交换。
其好处有⼀下⼏点:1.在Gauss会代的过程中,不会出现除数为0的情况。
2.减少误差传播,这主要是因为乘数⼩于等于1.(为何乘数⼩于等于1,如果选择这⼀列中绝对值最⼤的⼀个元素作为主元,我们假设这个元素是a,那么乘数等于-b/a,此时|b/a|<=1)。
matlab的lu分解
![matlab的lu分解](https://img.taocdn.com/s3/m/bb893c9e51e2524de518964bcf84b9d528ea2c8d.png)
matlab的lu分解什么是LU分解?LU分解是一种常用的线性代数求解方法,用于解决形如AX=B的线性方程组,其中A是一个非奇异矩阵,X是未知向量,B 是已知向量。
LU分解的目的是将矩阵A分解为两个矩阵L和U的乘积,其中L是一个下三角矩阵,U是一个上三角矩阵。
通过将线性方程组转化为LU分解的形式,我们可以更方便地求解线性方程的解。
LU分解的具体步骤如下:1. 矩阵A的LU分解可以写为A = LU, 其中L是一个下三角矩阵,U是一个上三角矩阵。
我们可以假设L的主对角线元素为1,而U的对角线元素则与矩阵A的对角线元素相同。
2. 在进行LU分解之前,我们可以首先判断矩阵A是否可以进行LU分解。
如果A的行列式不为零,则说明A是非奇异矩阵,可以进行LU分解。
否则,如果A的行列式为零,则说明A是奇异矩阵,无法进行LU 分解。
3. LU分解的第一步是找到L和U的第一行。
L的第一行是A的第一行,U的第一行是A的第一行的副本。
之后,我们要使用该行来取消下方的所有元素。
4. 对于LU分解的每一行i,我们需要通过以下步骤来计算U的第i行和L的第i列:- U的第i行直接等于矩阵A的第i行减去L的前i-1行和U的前i-1列的乘积。
- L的第i列等于A的第i列减去L的第i行前面的元素已经求得的U 的第i列与L的第i行的乘积。
5. 重复步骤4,直到我们得到L和U的全部元素。
最终,我们将得到L 和U的乘积与矩阵A相等,即A = LU。
6. 使用LU分解来求解线性方程组。
将AX=B转化为LUx = B的形式。
我们可以先解得下三角线性方程Lc = B,求得c的值,然后再解上三角线性方程Ux = c,求得未知向量x的值。
使用MATLAB进行LU分解MATLAB是一种强大的数值计算工具,可以用于执行矩阵运算,包括LU 分解。
下面是使用MATLAB进行LU分解的步骤:1. 首先,在MATLAB的命令窗口中定义矩阵A和向量B,即输入A和B的数值。
matlab实矩阵的jordan分解程序
![matlab实矩阵的jordan分解程序](https://img.taocdn.com/s3/m/346cde10443610661ed9ad51f01dc281e53a56dd.png)
matlab实矩阵的jordan分解程序Matlab是一种强大的数学软件,它在矩阵运算和线性代数方面具有很高的应用价值。
其中,Jordan分解是一种重要的矩阵分解方法,可以将一个方阵分解为Jordan标准型的形式。
在本文中,我们将介绍如何使用Matlab实现矩阵的Jordan分解。
我们需要明确什么是Jordan分解。
对于一个n阶方阵A,Jordan分解将其分解为以下形式:\[ A = PJP^{-1} \]其中,P是一个可逆矩阵,J是一个Jordan标准型的矩阵。
Jordan 标准型的矩阵具有如下形式:\[ J = \begin{bmatrix} J_1 & 0 & \cdots & 0 \\ 0 & J_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & J_k \end{bmatrix} \]其中,每个Ji是一个大小为ni的Jordan块,具有如下形式:\[ J_i = \begin{bmatrix} \lambda_i & 1 & 0 & \cdots & 0 \\ 0 & \lambda_i & 1 & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & \lambda_i \end{bmatrix} \]在Matlab中,我们可以使用函数`jordan`来进行矩阵的Jordan分解。
下面是一个示例程序:```matlab% 定义一个方阵AA = [1 1 0; 0 1 0; 0 0 2];% 计算A的Jordan分解[P, J] = jordan(A);% 打印结果disp('P =');disp(P);disp('J =');disp(J);```运行上述程序,我们可以得到矩阵A的Jordan分解结果。
MATLAB中的矩阵分解与求逆技巧
![MATLAB中的矩阵分解与求逆技巧](https://img.taocdn.com/s3/m/b6e5085253d380eb6294dd88d0d233d4b14e3f9e.png)
MATLAB中的矩阵分解与求逆技巧一、LU分解LU分解是将一个矩阵分解为一个下三角矩阵L和一个上三角矩阵U 的乘积。
在MATLAB中,可以使用lu函数进行LU分解,示例代码如下:A=[1,2,3;4,5,6;7,8,10];[L, U] = lu(A);其中,A是需要分解的矩阵,L和U是分解得到的下三角和上三角矩阵。
LU分解常用于求解线性方程组。
二、QR分解QR分解是将一个矩阵分解为一个正交矩阵Q和一个上三角矩阵R的乘积。
在MATLAB中,可以使用qr函数进行QR分解,示例代码如下:A=[1,2,3;4,5,6;7,8,10];[Q, R] = qr(A);其中,A是需要分解的矩阵,Q和R是分解得到的正交矩阵和上三角矩阵。
QR分解常用于求解最小二乘问题和特征值问题。
三、奇异值分解奇异值分解(SVD)是将一个矩阵分解为一个正交矩阵U、一个对角矩阵Σ和一个正交矩阵V的乘积。
在MATLAB中,可以使用svd函数进行奇异值分解,示例代码如下:A=[1,2,3;4,5,6;7,8,10];[U, S, V] = svd(A);其中,A是需要分解的矩阵,U、S和V是分解得到的正交矩阵、对角矩阵和正交矩阵。
奇异值分解常用于矩阵压缩和降维。
四、矩阵求逆在MATLAB中,可以使用inv函数求一个矩阵的逆矩阵,示例代码如下:A=[1,2;3,4];A_inv = inv(A);其中,A是需要求逆的矩阵,A_inv是求得的逆矩阵。
需要注意的是,矩阵A必须是可逆的,否则将会抛出异常。
除了使用inv函数外,还可以使用左除法或右除法来求解线性方程组。
例如,对于方程组AX=B,可以使用X=A\B求解,示例代码如下:A=[1,2;3,4];B=[1;2];X=A\B;其中,A是系数矩阵,B是常数矩阵,X是未知数矩阵。
需要注意的是,系数矩阵A必须是可逆的,否则将无法求解。
以上是MATLAB中常用的矩阵分解和求逆技巧。
通过这些技巧,可以在MATLAB中方便地进行矩阵计算和线性方程组求解,提高计算效率和准确性。
matlab的lu分解 -回复
![matlab的lu分解 -回复](https://img.taocdn.com/s3/m/c989c8aaafaad1f34693daef5ef7ba0d4a736dcf.png)
matlab的lu分解-回复MATLAB中的LU分解是一种常用的矩阵分解方法。
LU分解可以将一个矩阵分解为一个下三角矩阵L和一个上三角矩阵U的乘积。
该分解在求解线性方程组、计算矩阵的行列式和逆矩阵等问题中具有重要的应用。
首先,我们来看一下MATLAB中进行LU分解的基本语法。
MATLAB提供了一个内置函数lu来实现矩阵的LU分解,其调用形式为:[L, U, P] = lu(A)其中A是需要进行分解的矩阵,L和U分别是得到的下三角矩阵和上三角矩阵,P是置换矩阵。
在这个函数调用中,返回的下标为1的值是L,下标为2的值是U,下标为3的值是P。
接下来,我们将通过一个具体的例子来说明MATLAB中的LU分解的使用方法。
假设我们有一个3 ×3的矩阵A,请根据以下步骤来进行LU分解。
步骤1:定义待分解的矩阵A。
matlabA = [5, -2, 1; -1, 6, -2; 3, -1, 5];步骤2:调用lu函数进行LU分解。
matlab[L, U, P] = lu(A);在这个例子中,我们得到的L、U和P分别为:matlabL = [1, 0, 0; -0.2, 1, 0; 0.6, -0.5, 1]U = [5, -2, 1; 0, 5.6, -1.8; 0, 0, 1]P = [0, 1, 0; 1, 0, 0; 0, 0, 1]步骤3:验证LU分解结果。
为了验证我们得到的LU分解结果是否正确,我们可以计算L、U和P的乘积,看是否等于原始矩阵A。
matlabA_reconstructed = P * L * U;然后,我们可以比较A_reconstructed和A是否相等。
如果它们相等,则说明我们得到的LU分解结果是正确的。
matlabis_equal = ismembertol(A_reconstructed, A);此时,is_equal的值应该为1,表示A_reconstructed和A是相等的。
矩阵的LU分解(自编MATLAB)实验报告
![矩阵的LU分解(自编MATLAB)实验报告](https://img.taocdn.com/s3/m/ec84e6c6227916888586d738.png)
1矩阵的LU分解1.1 LU 分解原理定理:设A C n n,如果A的顺序主子式0, 0,…,0则存在唯一的主对角线上元素全为1 的下三角矩阵L与唯一的上三角矩阵U,使得A=LU.证明:对矩阵A的阶数使用数学归纳法.显然,当n=1 时,=1就是唯一的分解式。
现假定对n-1 阶矩阵,定理的结论成立。
对A进行分块A=其中.由于n-1 阶矩阵的k阶顺序主子式就是A 的k阶主子式(k=1,2,…,n-2),故它们都不为零.从而由归纳法假设,有唯一的LU分解其中的主对角线上的元素都1.由于==0所以是n-1阶可逆矩阵先假设已有A=LU,其中L=,U=,==A 则,,,是n-1阶可逆矩阵,则由上式可惟一确定,这就证明了A的LU分解的存在性和唯一性.1.2 LU分解算法当n 阶矩阵满足定理的条件时,可以用初等变换的方法求出L和U.因为当A=LU时,由于L 可逆,故必存在可逆矩阵P 使得即PA=PLU=U.也就是说,可以先对A施行行的初等变换得出上三角矩阵U,而矩阵P可以通过对单位矩阵I进行相同的行初等变换得出,即P(A,I)(PA,PI)(U,P)于是,为保持P为下三角矩阵(从而也是下三角矩阵),在进行行初等变换时,不能进行行的对换,上行的倍数应加到下行的对应元.1.3 LU分解用于解方程组矩阵的三角分解在求解线性方程组时十分方便.如对线性方程组由于是下三角矩阵,则解向量可以通过依次求出其分量而求出,在求解方程组可以通过该方程组依次求出分量而快速得出.于是由两个方程组的求解而给出的解.1.4程序流程图1.5 MATLAB程序function f=LU_decom(A)[m,n]=size(A)if m~=nfprintf('Error:m and n must be equal!m=%d,n=%d\n',m,n) endfor i=1:n-1if (det(A(1:i,1:i))==0)fprintf('Error:det A(%d,%d)=0!\n',i,i)flag='failure'return;elseflag='ok';endendL=eye(n);U=zeros(n);for i=1:nU(1,i)=A(1,i);endfor r=2:nL(r,1)=A(r,1)/U(1,1);endfor i=2:nfor j=i:nz=0;for r=1:i-1z=z+L(i,r)*U(r,j);endU(i,j)=A(i,j)-z;endif abs(U(i,i))<epsflag='failure'return;endfor k=i+1:nm=0;for q=1:i-1m=m+L(k,q)*U(q,i);endL(k,i)=(A(k,i)-m)/U(i,i); end endLU1.6 实际数据计算已知矩阵A先对A进性LU分解,并求解方程A的解.(1)A的LU分解在MATLAB命令行中输入A=[2 1 1;4 1 0;-2 2 1];并调用以上函数可得如下结果>> A=[2 1 1;4 1 0;-2 2 1];LU_decom(A)m =3n =3L =1 0 02 1 0-1 -3 1U =2 1 10 -1 -20 0 -4(2)解方程组,程序及结果如下%-----用LU分解解线性方程组------y=zeros(n,1);y(1)=b(1);for i=2:ny(i)=b(i)-sum(L(i,1:i-1)'.*y(1:i-1));endyx(n)=y(n)/U(n,n);for i=n-1:-1:1x(i)=(y(i)-sum(U(i,i+1:n)'.*x(i+1)))/U(i,i);endx=x'运行结果如下:y =12x =-0.50001.0000-0.50001.7数据分析调用MATLAB固有的LU分解函数,以及解方程组相关函数对以上数据进行计算,运行结果如下:>> A=[2 1 1;4 1 0;-2 2 1];>> b=[1 2 1]';>> [L,U]=lu(A)L =0.5000 0.2000 1.00001.0000 0 0-0.5000 1.0000 0U =4.0000 1.0000 00 2.5000 1.00000 0 0.8000>> X=inv(A)*bX =0.25001.0000-0.5000经比对结果相同,可见以上程序可行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Matlab 的n阶方阵的LDU分解实现
1.引言
矩阵的LDU分解是“矩阵理论与方法”课程中非常重要的一部分。
LDU分解在实际工程应用中也非常广泛。
LDU分解可以将一个矩阵分解为一个下三角矩阵和一个对角矩阵和一个上三角矩阵的乘积。
LDU分解主要应用在数值分析中,用来解线性方程、求反矩阵或计算行列式。
将系数矩阵A转变成等价两个矩阵L和U和对角矩阵的乘积,其中L和U 分别是下三角和上三角矩阵,D为对角矩阵。
当A的所有顺序主子式都不为0时,矩阵A可以分解为A=LDU。
即:
Matlab 是很好的处理矩阵的工具。
它的功能非常强大,包括创建矩阵,对矩阵求逆,转置等操作非常简单,使其成为图像处理,信号分析等领域常用的工具。
Matlab 官方已经包括了对非奇异矩阵的LU分解函数[L,U]=lu(A),为了加深对矩阵分解的理解,本文不采用Matlab 官方的LU分解函数对矩阵A进行LDU 分解,而是根据理论推导和编程实现LDU分解。
2.程序设计
2.1.输入合法检验
LU分解需要被分解矩阵A满足如下条件:
1)矩阵A为方阵
2)A的顺序主子式
全故LU分解需先检验A为n阶方阵,然后检验A的n-1个顺序主子式D
k 不为0,才可进行LU分解。
而检验主子式D
可以在n-1次循环LU分解中
k
进行,故先检验矩阵是否为方阵。
代码如下
2.2. n-1次循环LDU 分解
LDU 分解本质上是高斯消元法。
实质上是将A 通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵。
从下至上地对矩阵A 做初等行变换,将对角线左下方的元素变成零,然后再证明这些行变换的效果等同于左乘一系列单位下三角矩阵,这一系列单位下三角矩阵的乘积的逆就是L 矩阵,它也是一个单位下三角矩阵。
LDU 分解主要分为两步:
1根据高斯消元法对A i ()消元,消元矩阵为L i +1-1;2计算L i +1
-1A i ()=A i +1()以产生下一步迭代的A i ()。
2.2.1. 根据
构造L j ,L j -1(j =i +1)
高斯消元A i (),使A i ()第i+1列从第i+2行至n 行都为0。
构造消元矩阵L j ,L j -1。
首先判断是否为0,为0则无法继续分解,退出;否则继续。
代码如下
2.2.2. 计算L i +1-1A i ()=A i +1()
D
k
计算L
i+1
-1A i()=A i+1()并储存覆盖A i(),并计算下次循环的主子式。
代码如下
2.3.计算并返回L和A n-1()为结果
通过n-1次循环累乘L
i 得到L矩阵,并且根据最后得到的A n-1
()矩阵分解出
D和U矩阵。
代码如下3.验证结果
3.1.可LDU分解的矩阵验证
构造可以LDU分解的矩阵A D
k
调用MyLU函数,分解A矩阵。
计算L*D*U验证是否为原矩阵A(方法下同)
3.2.输入矩阵A是否为空验证
输入矩阵A 中没有元素,输入不合法。
3.3. 输入矩阵A 为方阵验证
输入矩阵A 维度不合法。
3.4. 顺序主子式出现0的错误验证
因为计算()0
1
1*L A -时出现()1
22
0a =,导致顺序主子式()()0
1
211220a a ∆==。
该情况为不合法输入。
至此,函数功能和合法性检查全部验证完毕。
4.心得体会
通过“矩阵理论与方法”的理论指导和Matlab编程的实践经验,我基本掌握了矩阵分解中的LDU分解的推导过程和算法步骤。
熟练掌握LDU分解,对今后研究LU分解、Doolittle分解、Crout分解、QR分解等矩阵分解方法的实现有非常大的帮助。
对LDU分解的推导过程进行步骤分解和归纳,我将N维矩阵的LDU 分解归纳总结为n-1次循环,每步循环进行n-i次元素除法(计算高斯消元系数),2次N维矩阵乘法(计算L和()1i A+)和1次元素乘法(计算顺序主子式的值)。
按乘法计算,即时间复杂度为
()()
()()
34
121
O n n i n O n
--++≈。
因为计算过程中
需要
1
,
j j
L L-
辅助计算矩阵和L i+1-1A i
()=A i+1()
,即空间复杂度为()2
O n。
该LDU分解设计还不够快速,占用空间相对较多,是以后改进的方向。
5.附录:程序源码
function [L,D,U] = MyLU(A)
%check validity
if(isempty(A))%check A if is empty
error('A is empty!');
end
[N,D] = size(A);
if(N ~= D)%check A if is square
error('A is not a square!');
end
%LDU decomposing
L = eye(N);
det_k = A(1,1);
for step_n = 1:N-1
if (det_k == 0)% check if Sequence principal minor appears 0
error('Sequence principal minor is 0');
end
Li = eye(N);
Li_inv = eye(N);
for step_row = step_n+1:N
mod=A(step_row,step_n)/A(step_n,step_n);
Li(step_row,step_n) = mod;
Li_inv(step_row,step_n) = -mod;
end
A = Li_inv * A;
det_k = det_k * A(step_n+1,step_n+1);
L = L * Li;
end
L = L;
D = eye(N);
U = zeros(N);
for i=1:N
if(A(i,i) ~= 0)
D(i,i) = A(i,i);
U(i,:) = A(i,:)/D(i,i);
else
D(i,i) = 0;
U(i,i) = 1;
end
end
end。