实Schur分解

前面已经说过LU,Cholesky和QR分解,这次介绍的是实Schur分解。对这个分解的定义是任意一个矩阵A,可有如下形式的分解:

U*A*U’ =
B;其中B是拟上三角矩阵,拟上三角矩阵的定义是在矩阵的对角线上存在2x2大小的矩阵,而且矩阵U是正交矩阵,因为矩阵A的特征值和B的特征值相同。而且A的特征值出现在B的对角线上。计算特征值分解和SVD都依靠这个算法做最基本的处理,然后根据不同的任务有不同的处理。

计算schur分解的方法是是QR算法,这个算法的原理相当的简单,可以用如下的伪代码表示:

for i = 1 …

A(i-1)= QR

A(i) = R*Q

end

这段代码所做的变化类似于A(i) = R*Q = (Q’)*Q*R*Q =
(Q’)*A(i-1)*Q;因此这段代码的基本思想就是使用正交矩阵Q不停的对矩阵A做相似变化。在这样的变化中将矩阵A的下半三角矩阵中的数全部消去。但是在实际中使用这样的算法是不现实的,因为每一次QR分解都需要大量的计算,同时完全的矩阵相乘R*Q也需要大量的计算。对这种方法的改进是首先将矩阵A化为Hessenberg型,然后对Hessenbert计算QR分解,对应的code如下:

function
[H, U] = zhess(A)

%for
any matrix A, turn it into a upper hessenberg matrix by orthogonal

%transformation

[m, n] =
size(A);

if
m ~= n

error(‘support square matrix
only‘)

end

H = A;

U = eye(n);

for
k=1:n-2

%compute the householder
matrix

[v,
beta] = zhouse(H(k+1:end, k));

temp_U = eye(n);

temp_U(k+1:n,k+1:n) = eye(n-k) - beta*v*(v‘);

H =
temp_U*H;

U =
U * temp_U;

%fprintf(‘after %d
iteration\n‘, k);

%disp(H);

end

这段代码将矩阵A转换成上hessenberg矩阵。

function
[NH] = zhessqr(H)

%
perform QR algorithm on upper hessenberg matrix

%
firstly, we need to verity this is a hessberg matrix

[m, n] =
size(H);

if
m ~= n

error(‘error, support square
matrix only‘)

end

NH = H;

c = zeros(1,
n-1);

s = zeros(1,
n-1);

for
k=1:n-1

%compute gives rotation at
first

[c(k), s(k)] = zgivens(NH(k, k), NH(k+1, k));

p =
[c(k) s(k); -s(k) c(k)];

NH(k:k+1, k:n) = (p‘)*NH(k:k+1, k:n);

%fprintf(‘after %d
iteration\n‘, k);

%disp(NH);

end

for
k=1:n-1

p =
[c(k) s(k); -s(k) c(k)];

NH(1:k+1, k:k+1) = NH(1:k+1,k:k+1)*p;

end

这段代码计算Hessenberg型矩阵A的一个QR step,在这里使用givens旋转来获得矩阵的QR分解提高了效率。

在QR算法中最主要的步骤就是QR step,首先做QR分解,然后R*Q,为了加快算法收敛的速度,使用了基于位移的QR算法,基本的伪代码如下:

for i=1 ...

A - a*I = QR

R*Q + a*I = A

end

使用这个方法可以加快QR算法的收敛速度。在这个算法的基础上有隐式双位移算法,称为Francis QR。首先给出显式的双位移算法:

for
i=1:infinite

H(0) - a1*I = Q(1)*R(1)

H(1) = R(1)*Q(1) + a1*I

H(1) - a2*I = Q(2)*R(2)

H(2) = R(2)*Q(2) + a2*I

end

略加推倒可以获得如下的公式:

>> H(2) = (Z’)*H*Z; M = Z*R; M = (H-a1*I)(H-a2*I);

Francis QR可以在不显式的构造矩阵M的情况下,完成H2=Z’ * H * Z;

Francis QR算法可以使用依赖于隐式Q定理,对应的Matlab代码如下:

function
[H, U] = zfrancisqr(A)

%compute
one of the step by implicitly shifted QR step

[m, n] =
size(A);

if
m ~= n

error(‘support square matrix
only‘)

end

m = n-1;

s = A(m, m) +
A(n, n);

t = A(m, m)*A(n,
n) - A(m, n)*A(n, m);

x = A(1,1)*A(1,1)
+ A(1,2)*A(2,1) - s*A(1,1) + t;

y =
A(2,1)*(A(1,1) + A(2,2) - s);

z =
A(2,1)*A(3,2);

for
k=0:n-3

[v,
beta] = zhouse([x y z]‘);

q =
max([1 k]);

%orthogonal transformation

ot
= (eye(3) - beta*v*(v‘));

A(k+1:k+3,q:n) = ot*A(k+1:k+3, q:n);

r =
min([k+4 n]);

A(1:r, k+1:k+3) = A(1:r, k+1:k+3)*(ot‘);

x =
A(k+2, k+1);

y =
A(k+3, k+1);

if k < n-3

z = A(k+4, k+1);

end

end

[v, beta] =
zhouse([x y]‘);

ot = eye(2) -
beta*v*(v‘);

A(n-1:n, n-2:n) =
ot*A(n-1:n, n-2:n);

A(1:n, n-1:n) =
A(1:n, n-1:n)*(ot‘);

H = A;

U = eye(n);

隐式Q定理的基本内容如下:对于矩阵A,存在两个不同的相似变换Q’*A*Q = H,
V’*A*V=G,H和G是上Hessenberg矩阵,如果Q和V的第一列相同,那么这两个不同的相似变换就是等价的。因此Francis
QR的第一步就是计算矩阵M的第一列,然后使用householder
reflector将之变成e1,然后将变换后的矩阵转换成上Hessenberg矩阵,这个时候就完成了一步Francis
QR。这个方式之所以可以使用隐式Q定理是因为第一个householder reflector是针对M的第一列计算的,而且后来的householder
reflector的第一列都是e1,因为最后计算出的变换矩阵的第一列和直接在M上计算QR分解是相同的。

这就是QR算法涉及的主要内容,事实上QR算法的研究很多,但是这里这是给出基本的,而且没有给出完成的计算程序,是因为我现在还不能完全理解整个过程。下面对于Spectral
Decomposition和Singular Value
Decompositon介绍也要搁置一段时间,第一是因为两个算法很复杂,需要一段时间来理解;第二个原因是因为现在没有很强的需求去研究到这样的细节。目前依靠LAPACK和Matlab足以解决我大部分的任务,慢慢来吧。

实Schur分解,布布扣,bubuko.com

时间: 2024-10-12 22:14:00

实Schur分解的相关文章

QR分解

从矩阵分解的角度来看,LU和Cholesky分解目标在于将矩阵转化为三角矩阵的乘积,所以在LAPACK种对应的名称是trf(Triangular Factorization).QR分解的目的在于将矩阵转化成正交矩阵和上三角矩阵的乘积,对应的分解公式是A=Q*R.正交矩阵有很多良好的性质,比如矩阵的逆和矩阵的转置相同,任意一个向量和正交矩阵的乘积不改变向量的2范数等等.QR分解可以用于求解线性方程组,线性拟合.更重要的是QR分解是QR算法的基础,可以用于各种特征值问题,所以QR分集的应用非常广泛.

GNU scientific library

GNU scientific library 是一个强大的C,C++数学库.它涉及的面很广,并且代码效率高,接口丰富.正好最近做的一个项目中用到多元高斯分布,就找到了这个库. GNU scientific library下载地址:http://ftpmirror.gnu.org/gsl/ 相应说明文档下载地址: http://www.gnu.org/software/gsl/manual/gsl-ref.ps.gz 编译时需要加上一些后缀: g++ xxx.cpp -lgsl -lgslcbla

MATLAB命令大全和矩阵操作大全

转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在"[ ]"内: b.矩阵的同行元素之间用空格(或",")隔开: c.矩阵的行与行之间用";"(或回车符)隔开: d.矩阵的元素可以是数值.变量.表达式或函数: e.矩阵的尺寸不必预先定义. 二,矩阵的创建: 1.直接输

Matlab学习---------MATLAB命令大全

MATLAB命令大全 管理命令和函数 help 在线帮助文件 doc 装入超文本说明 what M.MAT.MEX文件的目录列表 type 列出M文件 lookfor 通过help条目搜索关键字 which 定位函数和文件 Demo 运行演示程序 Path 控制MATLAB的搜索路径 管理变量和工作空间 Who 列出当前变量 Whos 列出当前变量(长表) Load 从磁盘文件中恢复变量 Save 保存工作空间变量 Clear 从内存中清除变量和函数 Pack 整理工作空间内存 Size 矩阵的

matlab常用操作备忘

(1)管理命令和函数 addpath  :添加目录到MATLAB搜索路径 doc      :在Web浏览器上现实HTML文档 help     :显示Matlab命令和M文件的在线帮助 helpwin helpdesk :help 兄弟几个 lookfor  :在基于Matlab搜索路径的所有M文件中搜索关键字 partialpath:部分路径名      8*) path     :所有关于路径名的处理 pathtool :一个不错的窗口路径处理界面 rmpath   :删除搜索路径中指定目

2018年秋季学期课表

李理论基础I.II 课程编码:011D9101Z﹡ 课时:80 学分:4.00 课程属性:其它 主讲教师:聂思安 教学目的要求李群和李代数(Lie group and Lie algebra)是在1874年由挪威数学家SophusLie为研究微分方程的对称性而引进的.后经过E. Cartan 和H. Weyl等人的努力,李的理论已成了微分几何的重要研究工具并发展成完整的代数理论.上世纪初,人们发现了李群和李代数在量子物理起重要作用.如今,它在诸如微分几何.偏微分方程.拓扑.数论.控制论.代数编码

MATLAB编程与应用系列-第3章 矩阵运算(4)

本系列教程来源于出版设计<基于MATLAB编程基础与典型应用书籍>,如涉及版权问题,请联系:[email protected]. 出版社:人民邮电出版社, 页数:525. 本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:[email protected] ##3.2 矩阵的分解矩阵的分解是矩阵相关运算中的重要内容,MATLAB提供了用于矩阵分解运算的多种函数.本节将集中介绍MATLAB所提供的矩阵分解运算函数的功能及使用. ###3.2

经典Mathematica函数大全

转自:http://blog.renren.com/share/238323208/8426343822  Mathmatic 函数表  一.运算符及特殊符号 Line1; 执行Line,不显示结果 Line1,line2 顺次执行Line1,2,并显示结果 ?name 关于系统变量name的信息 ??name 关于系统变量name的全部信息 !command 执行Dos命令 n! N的阶乘 !!filename 显示文件内容 < Expr>> filename 打开文件写 Expr&g

DSO 中的Windowed Optimization

该博客内容发表在泡泡机器人公众号上,请尊重泡泡机器人公众号的版权声明 DSO中除了完善直接法估计位姿的误差模型外(加入了仿射亮度变换,光度标定,depth优化),另一个核心就是像okvis一样使用sliding window来优化位姿,Engel也专门用了一节来介绍它.sliding window 就像c++中的队列,队首进来一个新人,队尾出去一个老人,它更像王朝中武将的新老交替,老将解甲归田,新人受window大王的重用,然而安抚老将不得当,会使得SLAM王朝土崩瓦解.对于初次接触slidin