Mercurial > matrix-functions
diff toolbox/qmult.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/qmult.m Thu May 07 18:36:24 2015 +0200 @@ -0,0 +1,47 @@ +function B = qmult(A) +%QMULT Pre-multiply by random orthogonal matrix. +% QMULT(A) is Q*A where Q is a random real orthogonal matrix from +% the Haar distribution, of dimension the number of rows in A. +% Special case: if A is a scalar then QMULT(A) is the same as +% QMULT(EYE(A)). + +% Called by RANDSVD. +% +% Reference: +% G.W. Stewart, The efficient generation of random +% orthogonal matrices with an application to condition estimators, +% SIAM J. Numer. Anal., 17 (1980), 403-409. + +[n, m] = size(A); + +% Handle scalar A. +if max(n,m) == 1 + n = A; + A = eye(n); +end + +d = zeros(n); + +for k = n-1:-1:1 + + % Generate random Householder transformation. + x = randn(n-k+1,1); + s = norm(x); + sgn = sign(x(1)) + (x(1)==0); % Modification for sign(1)=1. + s = sgn*s; + d(k) = -sgn; + x(1) = x(1) + s; + beta = s*x(1); + + % Apply the transformation to A. + y = x'*A(k:n,:); + A(k:n,:) = A(k:n,:) - x*(y/beta); + +end + +% Tidy up signs. +for i=1:n-1 + A(i,:) = d(i)*A(i,:); +end +A(n,:) = A(n,:)*sign(randn); +B = A;