前面已经说过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);