Mercurial > octave-nkf
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 } |