diff toolbox/kahan.m @ 0:8f23314345f4 draft

Create local repository for matrix toolboxes. Step #0 done.
author Antonio Pino Robles <data.script93@gmail.com>
date Wed, 06 May 2015 14:56:53 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolbox/kahan.m	Wed May 06 14:56:53 2015 +0200
@@ -0,0 +1,43 @@
+function U = kahan(n, theta, pert)
+%KAHAN  Kahan matrix - upper trapezoidal.
+%       KAHAN(N, THETA) is an upper trapezoidal matrix
+%       that has some interesting properties regarding estimation of
+%       condition and rank.
+%       The matrix is N-by-N unless N is a 2-vector, in which case it
+%       is N(1)-by-N(2).
+%       The parameter THETA defaults to 1.2.
+%       The useful range of THETA is 0 < THETA < PI.
+%
+%       To ensure that the QR factorization with column pivoting does not
+%       interchange columns in the presence of rounding errors, the diagonal
+%       is perturbed by PERT*EPS*diag( [N:-1:1] ).
+%       The default is PERT = 25, which ensures no interchanges for KAHAN(N)
+%       up to at least N = 90 in IEEE arithmetic.
+%       KAHAN(N, THETA, PERT) uses the given value of PERT.
+
+%       The inverse of KAHAN(N, THETA) is known explicitly: see
+%       Higham (1987, p. 588), for example.
+%       The diagonal perturbation was suggested by Christian Bischof.
+%
+%       References:
+%       W. Kahan, Numerical linear algebra, Canadian Math. Bulletin,
+%          9 (1966), pp. 757-801.
+%       N.J. Higham, A survey of condition number estimation for
+%          triangular matrices, SIAM Review, 29 (1987), pp. 575-596.
+
+if nargin < 3, pert = 25; end
+if nargin < 2, theta = 1.2; end
+
+r = n(1);              % Parameter n specifies dimension: r-by-n.
+n = n(max(size(n)));
+
+s = sin(theta);
+c = cos(theta);
+
+U = eye(n) - c*triu(ones(n), 1);
+U = diag(s.^[0:n-1])*U + pert*eps*diag( [n:-1:1] );
+if r > n
+   U(r,n) = 0;         % Extend to an r-by-n matrix.
+else
+   U = U(1:r,:);       % Reduce to an r-by-n matrix.
+end