comparison src/DLD-FUNCTIONS/schur.cc @ 10617:9c9e07f5eb1c

make schur mark triangular matrices on output
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 10 May 2010 07:50:56 +0200
parents f7501986e42d
children 23d2378512a0
comparison
equal deleted inserted replaced
10616:d61caf612f1e 10617:9c9e07f5eb1c
35 #include "defun-dld.h" 35 #include "defun-dld.h"
36 #include "error.h" 36 #include "error.h"
37 #include "gripes.h" 37 #include "gripes.h"
38 #include "oct-obj.h" 38 #include "oct-obj.h"
39 #include "utils.h" 39 #include "utils.h"
40
41 template <class Matrix>
42 static octave_value
43 mark_upper_triangular (const Matrix& a)
44 {
45 octave_value retval = a;
46
47 octave_idx_type n = a.rows ();
48 assert (a.columns () == n);
49
50 const typename Matrix::element_type zero = typename Matrix::element_type ();
51
52 for (octave_idx_type i = 0; i < n; i++)
53 if (a(i,i) == zero)
54 return retval;
55
56 retval.matrix_type (MatrixType::Upper);
57
58 return retval;
59 }
40 60
41 DEFUN_DLD (schur, args, nargout, 61 DEFUN_DLD (schur, args, nargout,
42 "-*- texinfo -*-\n\ 62 "-*- texinfo -*-\n\
43 @deftypefn {Loadable Function} {@var{s} =} schur (@var{a})\n\ 63 @deftypefn {Loadable Function} {@var{s} =} schur (@var{a})\n\
44 @deftypefnx {Loadable Function} {@var{s} =} schur (@var{a}, \"complex\")\n\ 64 @deftypefnx {Loadable Function} {@var{s} =} schur (@var{a}, \"complex\")\n\
292 { 312 {
293 313
294 if (nargout == 0 || nargout == 1) 314 if (nargout == 0 || nargout == 1)
295 { 315 {
296 FloatComplexSCHUR result (ctmp, ord, false); 316 FloatComplexSCHUR result (ctmp, ord, false);
297 retval(0) = result.schur_matrix (); 317 retval(0) = mark_upper_triangular (result.schur_matrix ());
298 } 318 }
299 else 319 else
300 { 320 {
301 FloatComplexSCHUR result (ctmp, ord, true); 321 FloatComplexSCHUR result (ctmp, ord, true);
302 retval(1) = result.schur_matrix (); 322 retval(1) = mark_upper_triangular (result.schur_matrix ());
303 retval(0) = result.unitary_matrix (); 323 retval(0) = result.unitary_matrix ();
304 } 324 }
305 } 325 }
306 } 326 }
307 } 327 }
334 { 354 {
335 355
336 if (nargout == 0 || nargout == 1) 356 if (nargout == 0 || nargout == 1)
337 { 357 {
338 ComplexSCHUR result (ctmp, ord, false); 358 ComplexSCHUR result (ctmp, ord, false);
339 retval(0) = result.schur_matrix (); 359 retval(0) = mark_upper_triangular (result.schur_matrix ());
340 } 360 }
341 else 361 else
342 { 362 {
343 ComplexSCHUR result (ctmp, ord, true); 363 ComplexSCHUR result (ctmp, ord, true);
344 retval(1) = result.schur_matrix (); 364 retval(1) = mark_upper_triangular (result.schur_matrix ());
345 retval(0) = result.unitary_matrix (); 365 retval(0) = result.unitary_matrix ();
346 } 366 }
347 } 367 }
348 } 368 }
349 } 369 }