givens变换化上hessenborg矩阵为上三角矩阵

将矩阵化为上三角矩阵一般有两种方法,一个是Householder变换(镜面反射),一个是givens变换(在某个平面内的旋转)

旋转矩阵

givens变换化上hessenborg矩阵为上三角矩阵_第1张图片
givens变换化上hessenborg矩阵为上三角矩阵_第2张图片

matlab实现

function [T,bk] = givens( H,b )
%givens: 通过givens变换化上Hessenborg阵为上三角矩阵
%  化 Hx=b 为 Tx=c
    [~,n] = size(H);
    %提取
    Ht = H(n+1,:);
    H = H(1:n,:);
    b = b(1:n);
    %Rotate Matrix need to recrate every iteration
    %R = eye(n,n);%Rotate Matrix
    for k = 1:n-1
        R = eye(n,n);
        down = (H(k,k)^2+H(k+1,k)^2)^(1/2);
        s = H(k+1,k)/down;
        c = H(k,k)/down;
        R(k:k+1,k:k+1) = [c,s;-s,c];
        R
        H = R*H
        H(k+1,k) = 0;
        b = R*b
    end
    T = [H;Ht];
    bk = b;
end

效果

输入:
givens变换化上hessenborg矩阵为上三角矩阵_第3张图片
在这里插入图片描述
输出:
givens变换化上hessenborg矩阵为上三角矩阵_第4张图片
givens变换化上hessenborg矩阵为上三角矩阵_第5张图片
这也是GMRES过后要做的事情。化为上三角后,直接用回代法,就可以把方程组求出来了。

一般的回代:

function x = backward( A,b )
%backward:   上三角矩阵回带过程
% 求解Ax=b
    [~,c] = size(A);
    A = A(1:c,:);
    x = zeros(c,1);
    x(end) = b(end)/A(c,c);
    for k = 2:c
        V = x(c-k+2:c);
        x(c-k+1) = (b(c-k+1)-A(c-k+1,c-k+2:end)*V)/A(c-k+1,c-k+1);
    end
end

你可能感兴趣的:(医学图像代数重建,算法)