1.基于Givens变换QR分解Matlab代码
原作者:【原创】基于Givens变换QR分解Matlab代码|MATLAB 数学统计与优化|MATLAB技术论坛 - Powered by Discuz! (matlabsky.com)
function [Q,R]=qrgv(A) % 基于Givens变换,将方阵A分解为A=QR,其中Q为正交矩阵,R为上三角阵 % % 参数说明 % A:需要进行QR分解的方阵 % Q:分解得到的正交矩阵 % R:分解得到的上三角阵 % % 实例说明 % A=[-12 3 3;3 1 -2;3 -2 7]; % [Q,R]=qr(A) % 调用MATLAB自带的QR分解函数进行验证 % [q,r]=qrgv(A) % 调用本函数进行QR分解 % q*r-A % 验证 A=QR % q'*q % 验证q的正交性 % norm(q) % 验证q的标准化,即二范数等于1 % % 线性代数基础知识 % 1.B=P*A*inv(P),称A与B相似,相似矩阵具有相同的特征值 % 2.Q*Q'=I,称Q为正交矩阵,正交矩阵的乘积仍为正交矩阵 % % by dynamic of Matlab技术论坛 % see also http://www.matlabsky.com % contact me [email protected] % 2010-01-17 22:51:18 % n=size(A,1); R=A; Q=eye(n); for i=1:n-1 for j=2:n-i+1 x=R(i:n,i); rt=givens(x,1,j); r=blkdiag(eye(i-1),rt); Q=Q*r'; R=r*R; end end function [R,y]=givens(x,i,j) % 求解标准正交的Given变换矩阵R,使用Rx=y,其中y(j)=0,y(i)=sqrt(x(i)^2+x(j)^2) % % 参数说明 % x:需要进行Givens变换的列向量 % i:变为sqrt(x(i)^2+x(j)^2)的元素下标 % j:变为0的元素的下标 % R:Givens变换矩阵 % y:Givens变换结果 % % 实例说明 % x=[1 3 5 9 6]'; % 将3等效到9上 % [R,y]=givens(x,4,2) % 注意3的下标为2,9的下标为4 % R*x-y % 验证Rx=y % R'*R % 验证正交性 % norm(R) % 验证标准性,就是范数为1 % % 关于Givens变换说明 % 1.Givens矩阵是标准正交矩阵,也叫平面旋转矩阵,它是通过坐标旋转的原理将元素j的数值等效到元素i上 % 2.Givens变换每次只能将一个元素变为0,而Householder变换则一次可以将任意个元素变为0 % 3.Givens变换常用于将矩阵A变为对角阵 % xi=x(i); xj=x(j); r=sqrt(xi^2+xj^2); cost=xi/r; sint=xj/r; R=eye(length(x)); R(i,i)=cost; R(i,j)=sint; R(j,i)=-sint; R(j,j)=cost; y=x(:); y([i,j])=[r,0];
但是我跑不出来?不知道为什么
2. Doolittle分解
function [L,U] = myLU(A) n=length(A); L=eye(n,n); U=zeros(n,n); U(1,1:n)=A(1,1:n); L(2:n,1)=A(2:n,1)./U(1,1); for r=2:n i=r:n; U(r,i)=A(r,i)-L(r,1:r-1)*U(1:r-1,i); i=r+1:n; L(i,r)=(A(i,r)-L(i,1:r-1)*U(1:r-1,r))/U(r,r); end end
原作者:(5条消息) Doolittle分解(matlab代码)_I_Like_Algorithms的博客-CSDN博客
3.Householder QR分解
[M,N]=size(A); %获得矩阵维数 A1=A; H1=zeros(M,M); for j=1:M H1(j,j)=1; end %k表示对所有的列 for k=1:N %设置H矩阵初值,这里设置为单位矩阵 H0=zeros(M,M); %设置为单位矩阵 for i=1:M H0(i,i)=1; end s=0; for i=k:M s=s+A1(i,k)*A1(i,k); end %算的向量的2范数 s=sqrt(s); u=zeros(N,1); %--------------------------------- % 这段甚为重要,关系到数值稳定性问题 % 目的是使得u的2范数尽可能大 % 原则是,如果首元素大于零,则u的第一个元素是正+正 % 如果首元素小于零,则u的第一个元素是负-负 if (A1(k,k)>=0) u(k)=A1(k,k)+s; else u(k)=A1(k,k)-s; end %------------------------------- for i=k+1:M u(i)=A1(i,k); end du=0; for i=k:M %求的单位u 长度平方 du=du+u(i)*u(i); end %计算得到大的H矩阵 for i=k:M for j=k:M H0(i,j)=-2*u(i)*u(j)/du; if i==j H0(i,j)=1+H0(i,j); end end end %千万要注意矩阵相乘的次序 %先更新矩阵 A2=H0*A1; A1=A2; %H1初值为单位矩阵,后逐步更新 H1=H1*H0; %更新变换后的矩阵 end Q=H1; R=A1;
4.Court分解
暂无
标签:Givens,QR,end,矩阵,A1,Doolittle,Matlab,分解 From: https://www.cnblogs.com/LYoungH/p/17023827.html