Mercurial > hg > octave-nkf
changeset 1959:9fae6fc592f2
[project @ 1996-02-15 04:54:32 by jwe]
author | jwe |
---|---|
date | Thu, 15 Feb 1996 04:54:32 +0000 |
parents | 9ca852da0017 |
children | 285a7f683a4c |
files | liboctave/dMatrix.cc liboctave/dMatrix.h |
diffstat | 2 files changed, 105 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/dMatrix.cc +++ b/liboctave/dMatrix.cc @@ -96,6 +96,17 @@ double F77_FCN (dlange, DLANGE) (const char*, const int&, const int&, const double*, const int&, double*); + + int F77_FCN (qzhes, QZHES) (const int&, const int&, double*, + double*, const long&, double*); + + int F77_FCN (qzit, QZIT) (const int&, const int&, double*, double*, + const double&, const long&, double*, + int&); + + int F77_FCN (qzval, QZVAL) (const int&, const int&, double*, + double*, double*, double*, double*, + const long&, double*); } // Matrix class. @@ -2684,6 +2695,96 @@ return retval; } +ComplexColumnVector +Qzval (const Matrix& a, const Matrix& b) +{ + ComplexColumnVector retval; + + int a_nr = a.rows(); + int a_nc = a.cols(); + + int b_nr = b.rows(); + int b_nc = b.cols(); + + if (a_nr == a_nc) + { + if (a_nr == b_nr && a_nc == b_nc) + { + if (a_nr != 0) + { + Matrix jnk (a_nr, a_nr, 0.0); + double *pjnk = jnk.fortran_vec (); + + ColumnVector alfr (a_nr); + double *palfr = alfr.fortran_vec (); + + ColumnVector alfi (a_nr); + double *palfi = alfr.fortran_vec (); + + ColumnVector beta (a_nr); + double *pbeta = alfr.fortran_vec (); + + Matrix atmp = a; + double *pa = atmp.fortran_vec (); + + Matrix btmp = b; + double *pb = btmp.fortran_vec (); + + long matz = 0; + int info; + + // XXX FIXME ??? XXX + double eps = DBL_EPSILON; + + F77_FCN (qzhes, QZHES) (a_nr, a_nr, pa, pb, matz, pjnk); + + F77_FCN (qzit, QZIT) (a_nr, a_nr, pa, pb, eps, matz, pjnk, info); + + if (! info) + { + F77_FCN (qzval, QZVAL) (a_nr, a_nr, pa, pb, palfr, + palfi, pbeta, matz, pjnk); + + // Count and extract finite generalized eigenvalues. + + int cnt = 0; + + for (int i = 0; i < a_nr; i++) + if (beta.elem (i) != 0) + cnt++; + + ComplexColumnVector cx (cnt, 0.0); + + Complex Im (0, 1); + + for (int i = 0; i < a_nr; i++) + { + if (beta.elem (i) != 0) + { + // Finite generalized eigenvalue. + + cnt--; + cx.elem (cnt) = (alfr.elem (i) + Im * alfi.elem (i)) + / beta.elem (i); + } + } + + retval = cx; + } + else + (*current_liboctave_error_handler) + ("qzval: trouble in qzit, info = %d", info); + } + } + else + (*current_liboctave_error_handler) ("nonconformant matrices"); + } + else + (*current_liboctave_error_handler) ("qzval: square matrices required"); + + return retval; +} + /* ;;; Local Variables: *** ;;; mode: C++ ***
--- a/liboctave/dMatrix.h +++ b/liboctave/dMatrix.h @@ -242,9 +242,11 @@ Matrix (double *d, int r, int c) : MArray2<double> (d, r, c) { } }; -Matrix Givens (double, double); +extern Matrix Givens (double, double); -Matrix Sylvester (const Matrix&, const Matrix&, const Matrix&); +extern Matrix Sylvester (const Matrix&, const Matrix&, const Matrix&); + +extern ComplexColumnVector Qzval (const Matrix& a, const Matrix& b); #endif