加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

三种实现矩阵QR分解的算法与程序

(2017-07-08 18:46:32)
标签:

矩阵分析

qr分解

矩阵分解

分类: 计算方法-算法与程序

To learn, to share, to debate, then comes progress.

--------------------------------------------------------------------------------------------------


QR分解

若非奇异矩阵A能够分解为一个正交矩阵Q与非奇异上三角矩阵R的乘积,即:

A=QR。则称其为AQR分解。

 实现QR分解的方法有很多种,包括Givens变换法,Householder变换法,Schemit正交化法。具体原理可以参考《矩阵论》(程云鹏,西工大出版)教材,这里仅给出三种实现QR分解的程序。

 

1.基于Givens变换的QR分解

%***********************************************

%矩阵分析与应用-利用Givens变换实现矩阵的QR分解

%输入:A-NxN的矩阵  输出:Q-正交阵 R-上三角阵

17.4  by Howie

function [Q,R]=md_qrg(A)

% if size(A,1)~=size(A,2)

    disp('please input a matrix by N x N');

    return

% end

[N,M]=size(A);

R=zeros(N);

T=eye(N);

B=A;

for j=1:N-1

    Tj=eye(N+1-j);T_t=eye(N);

    B=B(min(j,2):end,min(j,2):end);

    b=B(:,1);

    for i=2:N+1-j

        T_temp=eye(N+1-j);

        cs=sqrt(b(1)^2+b(i)^2);

        c=b(1)/cs;

        s=b(i)/cs;

        T_temp(1,1)=c;T_temp(i,i)=c;

        T_temp(i,1)=-s;T_temp(1,i)=s;

        b=T_temp*b;

        Tj=T_temp*Tj;

    end

    B=Tj*B;

    R(j,j:end)=B(1,:);

    T_t(j:end,j:end)=Tj;

    T(j:end,j:end)=Tj*T(j:end,j:end);

    T=T_t*T;

end

R(j+1,j+1:end)=B(end,end);

Q=T';



2.基于Householder变换的QR分解

%***********************************************

%矩阵分析与应用-利用Householder变换实现矩阵的QR分解

%输入:A-NxN的矩阵  输出:Q-正交阵 R-上三角阵

17.4  by Howie

function [Q,R]=md_qrh(A)

[N,M]=size(A);

B=A;

R=zeros(M);

H=eye(N);

%apply Householder transform on every column of the matrix, the length

�creases by 1 each step

for j=1:M-1

    H_t=eye(N);

    B=B(min(2,j):end,min(2,j):end);

    Hj=hst(B(:,1));

    B=Hj*B;

    R(j,j:end)=B(1,:);

    H_t(j:end,j:end)=Hj;

    H=H_t*H;

end

R(j+1:end,j+1:end)=B(end,end);

Q=H';

 

%Householder transform matrix

function [H]=hst(x)                 

xmod=sqrt(sum(x.*x));

alpha=-sign(x(1))*xmod;

x(1)=x(1)+alpha;

u=x/sqrt(sum(x.*x));

H=eye(length(x))-2*(u*u');

 

 

3.基于Schmidt正交化法的QR分解

%***********************************************

%矩阵分析与应用-利用Schmidt正交化实现矩阵的QR分解

%输入:A-NxN的矩阵  输出:Q-正交阵 R-上三角阵

17.4  by Howie

function [Q,R]=md_qrs(A)

[N,M]=size(A);

B=zeros(size(A));

Q=B;

C=eye(M);                     %初始化

B(:,1)=A(:,1);                %第一组列向量正交化

for j=2:M

    b=A(:,j);

    for i=1:j-1                 %正交化

        kij=fkij(A(:,j),B(:,i)); %内积计算系数

        b=b-kij*B(:,i);

        C(i,j)=kij;

    end

    B(:,j)=b;                    %j列正交化完成

end

bmod=zeros(1,M);

for j=1:M                        %列向量归一化

    b=B(:,j);

    bmod(j)=sqrt(sum(b.*b));

    Q(:,j)=b/bmod(j);

end

R=diag(bmod)*C;                  %以模为元素生成对角阵,产生R矩阵

 

  function [k]=fkij(a,b)

    k=sum(a.*b)/sum(b.*b);


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有