首页 > 其他分享 >电子工程数学方法-Matlab Doolittle Householder Givens

电子工程数学方法-Matlab Doolittle Householder Givens

时间:2023-01-04 16:44:13浏览次数:80  
标签:Givens QR end 矩阵 A1 Doolittle Matlab 分解

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分解

原作者(5条消息) Householder Transformation 进行QR分解Matlab代码__VioletHan_的博客-CSDN博客_householder transformations matlab

[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

相关文章