Mercurial > matrix-functions
diff toolbox/trap2tri.m @ 2:c124219d7bfa draft
Re-add the 1995 toolbox after noticing the statement in the ~higham/mctoolbox/ webpage.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Thu, 07 May 2015 18:36:24 +0200 |
parents | 8f23314345f4 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolbox/trap2tri.m Thu May 07 18:36:24 2015 +0200 @@ -0,0 +1,56 @@ +function [Q, T] = trap2tri(L) +%TRAP2TRI Unitary reduction of trapezoidal matrix to triangular form. +% [Q, T] = TRAP2TRI(L), where L is an m-by-n lower trapezoidal +% matrix with m >= n, produces a unitary Q such that QL = [T; 0], +% where T is n-by-n and lower triangular. +% Q is a product of Householder transformations. + +% Called by RANDSVD. +% +% Reference: +% G.H. Golub and C.F. Van Loan, Matrix Computations, second edition, +% Johns Hopkins University Press, Baltimore, Maryland, 1989. +% P5.2.5, p. 220. + +[n, r] = size(L); + +if r > n | norm(L-tril(L),1) + error('Matrix must be lower trapezoidal and m-by-n with m >= n.') +end + +Q = eye(n); % To hold product of H.T.s + +if r ~= n + + % Reduce nxr L = r [L1] to lower triangular form: QL = [T]. + % n-r [L2] [0] + + for j=r:-1:1 + % x is the vector to be reduced, which we overwrite with the H.T. vector. + x = L(j:n,j); + x(2:r-j+1) = zeros(r-j,1); % These elts of column left unchanged. + s = norm(x)*(sign(x(1)) + (x(1)==0)); % Modification for sign(1)=1. + + % Nothing to do if x is zero (or x=a*e_1, but we don't check for that). + if s ~= 0 + x(1) = x(1) + s; + beta = s'*x(1); + + % Implicitly apply H.T. to pivot column. + % L(r+1:n,j) = zeros(n-r,1); % We throw these elts away at the end. + L(j,j) = -s; + + % Apply H.T. to rest of matrix. + if j > 1 + y = x'*L(j:n, 1:j-1); + L(j:n, 1:j-1) = L(j:n, 1:j-1) - x*(y/beta); + end + + % Update H.T. product. + y = x'*Q(j:n,:); + Q(j:n,:) = Q(j:n,:) - x*(y/beta); + end + end +end + +T = L(1:r,:); % Rows r+1:n have been zeroed out.