带原点位移的qr方法的MATLAB程序
function [Q,R] = qr_shift(A) % QR factorization with shift % A: input matrix % Q: orthogonal matrix % R: upper triangular matrix
[m,n] = size(A); Q = eye(m); for k = 1:n % apply shift if k == 1 mu = A(1,1); else mu = A(k,k-1); end A(k:end,k:end) = A(k:end,k:end) - mueye(m-k+1); % perform QR factorization [v,beta] = house(A(k:end,k)); Qk = eye(m-k+1) - betav*v'; Q(k:m,k:m) = Q(k:m,k:m)Qk; A(k:end,k:end) = QkA(k:end,k:end); end R = triu(A); end
function [v,beta] = house(x) % Householder reflector % x: input vector % v: Householder vector % beta: scaling factor
n = length(x); sigma = x(2:end)'x(2:end); if sigma == 0 && x(1) >= 0 v = zeros(n,1); beta = 0; elseif sigma == 0 && x(1) < 0 v = -2ones(n,1); v(1) = 1; beta = 2/(x'*x); else mu = sqrt(x(1)^2 + sigma); if x(1) >= 0 v(1) = x(1) + mu; else v(1) = x(1) - mu; end v(2:end) = x(2:end); beta = 2/(v'*v); v = v/beta; end end
原文地址: https://www.cveoy.top/t/topic/bRJ7 著作权归作者所有。请勿转载和采集!