首页 > 编程知识 正文

矩阵qr分解的意义,求矩阵A的qr分解

时间:2023-05-05 02:48:02 阅读:148045 作者:3061

为什么80%的循环农户不能成为架构师?

正交分解矩阵的正交分解也称为QR分解,是将矩阵分解为一个正交矩阵q和一个上三角矩阵的乘积的形式。

任何实数方阵a可以分解为。 这里的q是正交单位阵列,即r是上三角矩阵。 这种分解称为QR分解。 QR分解也有几种算法,常见的有gramSchmidt、Householder、Givens算法。 QR分解是将矩阵分解为一个正交矩阵和上三角矩阵的乘积。 在一张图中可以想象QR分解:

为什么需要正交分解呢?

在实际操作过程中,QR分解经常用于解决线性最小axdls平方问题,这将在后面讨论。

说起正交分解,我们必须考虑schmidtorthogonalizationschmidt正交化施密特正交化(househouseholder变换)

Schmidt正交化定理1 设A是n阶实非奇异矩阵,则存在正交矩阵Q和实非奇异上三角矩阵R使A有QR分解;且除去相差一个对角元素的绝对值(模)全等于1的对角矩阵因子外,分解是唯一的.

定理2 设A是mn实矩阵,且其n个列向量线性无关,则A有分解A=QR,其中Q是mn实矩阵,且满足QHTQ=E,R是n阶实非奇异上三角矩阵该分解除去相差一个对角元素的绝对值(模)全等于1的对角矩阵因子外是唯一的.用Schmidt正交化分解方法对矩阵进行QR分解时,所论矩阵必须是列满秩矩阵。

写出算法步长矩阵的列向量; 列向量根据Schmidt而正交化; 矩阵的q ',r '; 得到将r’列向量单位化并对q,r’的各行乘以r’的每个列的模式 matlab码function[X,q,r]=QRSchmidt(a,b ) %正方形矩阵的QR的Gram-Schmidt正交分解法endq=Zeros(m,n ); x=Zeros(n,1 ); r=Zeros(n; fork=1:NR(k,k )=norm ) a ) :k ); IFr(k,k )==0break; endq(3360,k )=a ) :k )/r ) k,k ); forj=k1:NR(k,j )=Q(:k ) ' *a ) :j ); A(:j(a653360,j )-r ) k,j ) *Q(:k ); endif nargin==2b=Q'* b; x(n )=b ) n )/r ) n,n ); forI=n-1:-1:1x(I )=(b ) I )-sum(r(I,i 1:n ).*x ) i 1:n ) ' )/r ) I,I ); endelseX=[]; endend Householder变换中,如果将a作为任意一个n次方阵,则必定存在n次酉矩阵q和n次上三角矩阵r,A=QR

设wCn为一个单位向量,令

h称为Householder矩阵或Householder变换。 对于任意存在,Householder矩阵h为Hx=-au。 其中

酉矩阵(unitary matrix ) ) ) ) ) ) ) )。

当满足n阶复矩阵a时

a称为酉矩阵,记为其中。 Ah是a的共轭转置

酉矩阵的性质

如果a是酉矩阵

也是酉矩阵;det(a )=1; 充分条件是其n个列向量是2个正交的单位向量。 算法的步骤将矩阵a按列写成a=(1,2,n )。 如果10,则存在n次的householder矩阵H1

如果1=0,则直接进入下一步骤。 这种情况相当于拿取。 另一方面,按每列写a1=0.矩阵an-1=(I,2,n-1 )。 如果10,则得到,即存在n-1阶householder矩阵h’2

此时,令

H2是n阶Householder矩阵,且

1=0时,直接进入下一个步骤,对n-2次矩阵继续同样的变换。 继续这样下去,在第n-1步中可以找到Householder矩阵H1,H2,Hn-1

那么,q是酉矩阵的积,一定要存在酉矩阵,且A=QR matlab码function[ X,q,R ]=QRHouseholder(A,b ) %通过Householder变换将方阵a与正交q x=Zeros(n,1 ); r=Zeros(n; P1=E; for k=1:n-1%结构w,PK=I-2ww's=-sign(a(k ) ) norm ) a ) k:n,k ) ); r(k,k )=-s; ifk==1w=[ a (1,1 ) s,a ) A(2:n,k ) ] '; elsew=[Zeros(1,k-1 ),a ) k,k ) s,a ) A(k 1:n,k ) ' ]; r(R(1:k-1,k )=a ) 1:k-1,k ); endifnorm(w ) )=0w=w/norm ) w; endP=E-2*w*w '; A=P*A; P1=P*P1; r(R(1:n,n )=a ) 1:n,n ); endQ=P1 '; if nargin==2

b=P1*b;X(n)=b(n)/R(n,n);for i=n-1:-1:1X(i)=(b(i)-sum(R(i,i+1:n).*X(i+1:n)'))/R(i,i);endelseX=[];end

matlab自带方法

%产生一个3*3大小的魔方矩阵A=magic(3)[Q,R]=qr(A)

使用Eigen C++ Eigen提供了几种矩阵分解的方法

分解方式Method矩阵满足条件计算速度计算精度PartialPivLUpartialPivLu()Invertible+++FullPivLUfullPivLu()None-+++HouseholderQRhouseholderQr()None+++ColPivHouseholderQRcolPivHouseholderQr()None+++FullPivHouseholderQRfullPivHouseholderQr()None-+++LLTllt()Positive definite++++LDLTldlt()Positive or negative semidefinite+++++

其中HouseholderQR、ColPivHouseholderQR、FullPivHouseholderQR是我们目前要用到的QR分解方法
C++的QR分解代码为

#include <iostream>#include <Eigen/Dense>using namespace Eigen;using namespace std;int main() { Matrix3d A; A<<1,1,1, 2,-1,-1, 2,-4,5; HouseholderQR<Matrix3d> qr; qr.compute(A); MatrixXd R = qr.matrixQR().triangularView<Upper>(); MatrixXd Q = qr.householderQ(); std::cout << "QR2(): HouseholderQR---------------------------------------------"<< std::endl; std::cout << "A "<< std::endl <<A << std::endl << std::endl; std::cout <<"qr.matrixQR()"<< std::endl << qr.matrixQR() << std::endl << std::endl; std::cout << "R"<< std::endl <<R << std::endl << std::endl; std::cout << "Q "<< std::endl <<Q << std::endl << std::endl; std::cout <<"Q*R" << std::endl <<Q*R << std::endl << std::endl; return 0;}

输出

好了大功告成,为什么我要写计算方法的文章呢,虽然现在有很多的库和包给我们调用,但是我们也不能忘了代码的本质是为了解决复杂的数学问题,从根源上去理解一种计算方法有助于我们对自身代码的优化,比如这些方法我们可以把它写到FPGA和CUDA等并行或者分布式的计算当中,加速我们的计算方法,这比直接单机去调用这些库会超乎想象的快。

转载于:https://my.oschina.net/VenusV/blog/3030201

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。