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

【原创】基于Givens变换QR分解Matlab代码

(2010-01-17 22:54:57)
标签:

givens变换

qr分解

matlab代码

latercomer

matlab技术论坛

杂谈

分类: MATLAB

本帖由Matlab技术论坛原创,原帖参见http://www.matlabsky.com/thread-4850-1-1.html,转载请注明Matlab技术论坛原创

 

如果有任何问题、建议,或者更多资源、代码、视频,欢迎您访问专业的Matlab技术交流平台——Matlab技术论坛http://www.matlabsky.com

 

Wish my dear girl,healthy pretty and oveliness

 

2010-1-17 22:53:19

 

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 matlabsky@gmail.com
% 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];

0

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

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

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

新浪公司 版权所有