利用Householder变换进行矩阵QR分解

非奇异矩阵QR分解

实(复)非奇异矩阵 A \boldsymbol{A} A,化成正交(酉)矩阵的 Q \boldsymbol{Q} Q与实(复)非奇异上三角矩阵的 R \boldsymbol{R} R的乘积的形式,即
A = Q R \boldsymbol{A=QR} A=QR

Householder变换

又称作对称变换,将需要变换的向量以某一镜像向量为参照进行对称变换,两向量关于镜像向量对称。假设Householder变换为 y = H x \boldsymbol{y=Hx} y=Hx,其中 H = I − 2 u u T \boldsymbol{H=I-2uu^T} H=I2uuT u u u便是镜像向量。
因此对于一个矩阵的变换相当于对矩阵的每一列分别进行Householder变换,将其变换成一个上三角矩阵所需要的形式,但是需要注意的是,每一次变换之后,矩阵A后续的列会发生变化。

贴代码

function [ H,U,R,T ] = my_qr_householder( A )
    if det(A)==0
        display('矩阵奇异,无法进行qr分解');
        return
    end
    R = sym([]);
    H = sym([]);
    U = sym([]);
    A = sym(A);
    n = size(A,1);
    T = sym(eye(n));
    sum = 1;
    for j = 1:n-1 %从第一列到第n-1列,之后的元素全部变换到第j列第j个元素上
        x = A(j:n,j);
        y = sqrt(x'*x);
        x(1) = x(1) - y;
        u = x./sqrt(x'*x);%向量单位化
        U(j:n,sum) = u;
        H(:,:,sum) = eye(n);
        H(j:n,j:n,sum) = H(j:n,j:n,sum) - 2*(u*u');
        R(1:j-1,:,sum) = A(1:j-1,:);
        R(j:n,j:n,sum) = simplify(H(j:n,j:n,sum)*A(j:n,j:n));
        T = H(:,:,sum)*T;
        A = R(:,:,sum);
        sum = sum + 1;
    end
    T = simplify(T)';
end

你可能感兴趣的:(线性代数,matlab)