home *** CD-ROM | disk | FTP | other *** search
- //-------------------------------------------------------------------//
-
- // Synopsis: Random, orthogonal upper Hessenberg matrix.
-
- // Syntax: H = ohess ( N )
-
- // Description:
-
- // H is an N-by-N real, random, orthogonal upper Hessenberg
- // matrix. Alternatively, H = OHESS(X), where X is an arbitrary
- // real N-vector (N > 1) constructs H non-randomly using the
- // elements of X as parameters. In both cases H is constructed
- // via a product of N-1 Givens rotations.
-
- // Note: See Gragg (1986) for how to represent an N-by-N
- // (complex) unitary Hessenberg matrix with positive subdiagonal
- // elements in terms of 2N-1 real parameters (the Schur
- // parametrization). This M-file handles the real case only and
- // is intended simply as a convenient way to generate random or
- // non-random orthogonal Hessenberg matrices.
-
- // Reference:
- // W.B. Gragg, The QR algorithm for unitary Hessenberg matrices,
- // J. Comp. Appl. Math., 16 (1986), pp. 1-8.
-
- // This file is a translation of ohess.m from version 2.0 of
- // "The Test Matrix Toolbox for Matlab", described in Numerical
- // Analysis Report No. 237, December 1993, by N. J. Higham.
-
- //-------------------------------------------------------------------//
-
- ohess = function ( x )
- {
- local (x)
- global (pi)
-
- if (any (imag (x))) { error("Parameter must be real."); }
-
- n = max(size(x));
-
- if (n == 1)
- {
- // Handle scalar x.
- n = x;
- x = rand(n-1, 1)*2*pi;
- H = eye(n,n);
- H[n;n] = sign(rand());
- else
- H = eye(n,n);
- H[n;n] = sign(x[n]) + (x[n]==0); // Second term ensures H[n;n] nonzero.
- }
-
- for (i in n:2:-1)
- {
- // Apply Givens rotation through angle x(i-1).
- theta = x[i-1];
- c = cos(theta);
- s = sin(theta);
- H[ [i-1, i] ;] = [ c*H[i-1;]+s*H[i;] ;
- -s*H[i-1;]+c*H[i;] ];
- }
-
- return H;
- };
-