# HG changeset patch # User Jaroslav Hajek # Date 1273470656 -7200 # Node ID 9c9e07f5eb1caf4e5b42a72ec29ce3434292f30d # Parent d61caf612f1ec5edeec4707f003c77fa02183b36 make schur mark triangular matrices on output diff -r d61caf612f1e -r 9c9e07f5eb1c src/ChangeLog --- a/src/ChangeLog Mon May 10 07:50:11 2010 +0200 +++ b/src/ChangeLog Mon May 10 07:50:56 2010 +0200 @@ -1,3 +1,7 @@ +2010-05-10 Jaroslav Hajek + + * DLD-FUNCTIONS/schur.cc (Fschur): Mark triangular matrices on output. + 2010-05-10 Jaroslav Hajek * ov-range.cc (octave_range::index_vector): Optimize order of diff -r d61caf612f1e -r 9c9e07f5eb1c src/DLD-FUNCTIONS/schur.cc --- a/src/DLD-FUNCTIONS/schur.cc Mon May 10 07:50:11 2010 +0200 +++ b/src/DLD-FUNCTIONS/schur.cc Mon May 10 07:50:56 2010 +0200 @@ -38,6 +38,26 @@ #include "oct-obj.h" #include "utils.h" +template +static octave_value +mark_upper_triangular (const Matrix& a) +{ + octave_value retval = a; + + octave_idx_type n = a.rows (); + assert (a.columns () == n); + + const typename Matrix::element_type zero = typename Matrix::element_type (); + + for (octave_idx_type i = 0; i < n; i++) + if (a(i,i) == zero) + return retval; + + retval.matrix_type (MatrixType::Upper); + + return retval; +} + DEFUN_DLD (schur, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {@var{s} =} schur (@var{a})\n\ @@ -294,12 +314,12 @@ if (nargout == 0 || nargout == 1) { FloatComplexSCHUR result (ctmp, ord, false); - retval(0) = result.schur_matrix (); + retval(0) = mark_upper_triangular (result.schur_matrix ()); } else { FloatComplexSCHUR result (ctmp, ord, true); - retval(1) = result.schur_matrix (); + retval(1) = mark_upper_triangular (result.schur_matrix ()); retval(0) = result.unitary_matrix (); } } @@ -336,12 +356,12 @@ if (nargout == 0 || nargout == 1) { ComplexSCHUR result (ctmp, ord, false); - retval(0) = result.schur_matrix (); + retval(0) = mark_upper_triangular (result.schur_matrix ()); } else { ComplexSCHUR result (ctmp, ord, true); - retval(1) = result.schur_matrix (); + retval(1) = mark_upper_triangular (result.schur_matrix ()); retval(0) = result.unitary_matrix (); } }