annotate libinterp/corefcn/schur.cc @ 19781:56157a7505ed

Add new ordschur function. * libinterp/corefcn/ordschur.cc: New file. * libinterp/corefcn/module.mk: Include it in the list of source files. * scripts/help/__unimplemented__.m: Remove ordschur from the list of unimplemented functions. * doc/interpreter/linalg.txi: Add it to the interpreter manual. * NEWS: Mention it. * libinterp/corefcn/schur.cc (schur): Reference it from the documentation of the schur function. Thanks to Carnë Draug for improving the original patch, and to Mike Miller for reviewing it and suggesting improvements.
author Sébastien Villemot <sebastien@debian.org>
date Sat, 07 Feb 2015 21:51:20 +0100
parents 4197fc428c7d
children 4f45eaf83908
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
1 /*
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
2
19731
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 19437
diff changeset
3 Copyright (C) 1996-2015 John W. Eaton
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
4
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
5 This file is part of Octave.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
6
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5823
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5823
diff changeset
10 option) any later version.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
11
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
15 for more details.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
16
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5823
diff changeset
18 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5823
diff changeset
19 <http://www.gnu.org/licenses/>.
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
20
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
21 */
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
22
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
24 #include <config.h>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
25 #endif
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
26
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
27 #include <string>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
28
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
29 #include "CmplxSCHUR.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
30 #include "dbleSCHUR.h"
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
31 #include "fCmplxSCHUR.h"
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
32 #include "floatSCHUR.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
33
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
34 #include "defun.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
35 #include "error.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
36 #include "gripes.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
37 #include "oct-obj.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
38 #include "utils.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
39
10617
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
40 template <class Matrix>
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
41 static octave_value
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
42 mark_upper_triangular (const Matrix& a)
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
43 {
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
44 octave_value retval = a;
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
45
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
46 octave_idx_type n = a.rows ();
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
47 assert (a.columns () == n);
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
48
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
49 const typename Matrix::element_type zero = typename Matrix::element_type ();
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
50
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
51 for (octave_idx_type i = 0; i < n; i++)
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
52 if (a(i,i) == zero)
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
53 return retval;
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
54
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
55 retval.matrix_type (MatrixType::Upper);
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
56
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
57 return retval;
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
58 }
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
59
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
60 DEFUN (schur, args, nargout,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
61 "-*- texinfo -*-\n\
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
62 @deftypefn {Built-in Function} {@var{S} =} schur (@var{A})\n\
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
63 @deftypefnx {Built-in Function} {@var{S} =} schur (@var{A}, \"real\")\n\
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
64 @deftypefnx {Built-in Function} {@var{S} =} schur (@var{A}, \"complex\")\n\
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
65 @deftypefnx {Built-in Function} {@var{S} =} schur (@var{A}, @var{opt})\n\
19050
b155fad47055 Fix error messages and %!fail tests for schur().
Rik <rik@octave.org>
parents: 17787
diff changeset
66 @deftypefnx {Built-in Function} {[@var{U}, @var{S}] =} schur (@dots{})\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
67 @cindex Schur decomposition\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
68 Compute the Schur@tie{}decomposition of @var{A}\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
69 @tex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
70 $$\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
71 S = U^T A U\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
72 $$\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
73 @end tex\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
74 @ifnottex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
75 \n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
76 @example\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
77 @code{@var{S} = @var{U}' * @var{A} * @var{U}}\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
78 @end example\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
79 \n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
80 @end ifnottex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
81 where @var{U} is a unitary matrix\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
82 @tex\n\
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
83 ($U^T U$ is identity)\n\
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
84 @end tex\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
85 @ifnottex\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
86 (@code{@var{U}'* @var{U}} is identity)\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
87 @end ifnottex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
88 and @var{S} is upper triangular. The eigenvalues of @var{A} (and @var{S})\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
89 are the diagonal elements of @var{S}. If the matrix @var{A}\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
90 is real, then the real Schur@tie{}decomposition is computed, in which the\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
91 matrix @var{U} is orthogonal and @var{S} is block upper triangular\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
92 with blocks of size at most\n\
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
93 @tex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
94 $2 \\times 2$\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
95 @end tex\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
96 @ifnottex\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
97 @code{2 x 2}\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
98 @end ifnottex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
99 along the diagonal. The diagonal elements of @var{S}\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
100 (or the eigenvalues of the\n\
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
101 @tex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
102 $2 \\times 2$\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
103 @end tex\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
104 @ifnottex\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
105 @code{2 x 2}\n\
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7814
diff changeset
106 @end ifnottex\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
107 blocks, when appropriate) are the eigenvalues of @var{A} and @var{S}.\n\
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
108 \n\
13224
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
109 The default for real matrices is a real Schur@tie{}decomposition.\n\
17281
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 17268
diff changeset
110 A complex decomposition may be forced by passing the flag\n\
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 17268
diff changeset
111 @qcode{\"complex\"}.\n\
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
112 \n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
113 The eigenvalues are optionally ordered along the diagonal according to\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
114 the value of @var{opt}. @code{@var{opt} = \"a\"} indicates that all\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
115 eigenvalues with negative real parts should be moved to the leading\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
116 block of @var{S}\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
117 (used in @code{are}), @code{@var{opt} = \"d\"} indicates that all eigenvalues\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
118 with magnitude less than one should be moved to the leading block of @var{S}\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
119 (used in @code{dare}), and @code{@var{opt} = \"u\"}, the default, indicates\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
120 that no ordering of eigenvalues should occur. The leading @var{k}\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
121 columns of @var{U} always span the @var{A}-invariant\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
122 subspace corresponding to the @var{k} leading eigenvalues of @var{S}.\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
123 \n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
124 The Schur@tie{}decomposition is used to compute eigenvalues of a\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
125 square matrix, and has applications in the solution of algebraic\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
126 Riccati equations in control (see @code{are} and @code{dare}).\n\
19781
56157a7505ed Add new ordschur function.
Sébastien Villemot <sebastien@debian.org>
parents: 19731
diff changeset
127 @seealso{rsf2csf, ordschur, lu, chol, hess, qr, qz, svd}\n\
3372
f16c2ce14886 [project @ 1999-11-23 19:07:09 by jwe]
jwe
parents: 3014
diff changeset
128 @end deftypefn")
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
129 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
130 octave_value_list retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
131
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
132 int nargin = args.length ();
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
133
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
134 if (nargin < 1 || nargin > 2 || nargout > 2)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
135 {
5823
080c08b192d8 [project @ 2006-05-19 05:32:17 by jwe]
jwe
parents: 5555
diff changeset
136 print_usage ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
137 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
138 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
139
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
140 octave_value arg = args(0);
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
141
3523
b80bbb43a1a9 [project @ 2000-02-02 10:25:52 by jwe]
jwe
parents: 3372
diff changeset
142 std::string ord;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
143
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
144 if (nargin == 2)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
145 {
19437
03067dab10ca Use stricter input validation when looking for a string as input (bug #42651).
Rik <rik@octave.org>
parents: 19068
diff changeset
146 if (args(1).is_string ())
03067dab10ca Use stricter input validation when looking for a string as input (bug #42651).
Rik <rik@octave.org>
parents: 19068
diff changeset
147 ord = args(1).string_value ();
03067dab10ca Use stricter input validation when looking for a string as input (bug #42651).
Rik <rik@octave.org>
parents: 19068
diff changeset
148 else
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
149 {
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
150 error ("schur: second argument must be a string");
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
151 return retval;
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
152 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
153 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
154
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
155 bool force_complex = false;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
156
13224
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
157 if (ord == "real")
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
158 {
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
159 ord = std::string ();
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
160 }
0a67c717c652 Add support for additional argument "real" to schur() (Bug #34012).
Rik <octave@nomad.inbox5.com>
parents: 12642
diff changeset
161 else if (ord == "complex")
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
162 {
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
163 force_complex = true;
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
164 ord = std::string ();
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
165 }
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
166 else
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
167 {
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
168 char ord_char = ord.empty () ? 'U' : ord[0];
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
169
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
170 if (ord_char != 'U' && ord_char != 'A' && ord_char != 'D'
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
171 && ord_char != 'u' && ord_char != 'a' && ord_char != 'd')
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
172 {
19050
b155fad47055 Fix error messages and %!fail tests for schur().
Rik <rik@octave.org>
parents: 17787
diff changeset
173 warning ("schur: incorrect ordered schur argument '%s'",
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
174 ord.c_str ());
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
175 return retval;
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
176 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
177 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
178
5275
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5008
diff changeset
179 octave_idx_type nr = arg.rows ();
23b37da9fd5b [project @ 2005-04-08 16:07:35 by jwe]
jwe
parents: 5008
diff changeset
180 octave_idx_type nc = arg.columns ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
181
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
182 if (nr != nc)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
183 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
184 gripe_square_matrix_required ("schur");
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
185 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
186 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
187
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
188 if (! arg.is_numeric_type ())
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
189 gripe_wrong_type_arg ("schur", arg);
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
190 else if (arg.is_single_type ())
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
191 {
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
192 if (! force_complex && arg.is_real_type ())
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
193 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
194 FloatMatrix tmp = arg.float_matrix_value ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
195
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
196 if (! error_state)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
197 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
198 if (nargout == 0 || nargout == 1)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
199 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
200 FloatSCHUR result (tmp, ord, false);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
201 retval(0) = result.schur_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
202 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
203 else
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
204 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
205 FloatSCHUR result (tmp, ord, true);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
206 retval(1) = result.schur_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
207 retval(0) = result.unitary_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
208 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
209 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
210 }
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
211 else
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
212 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
213 FloatComplexMatrix ctmp = arg.float_complex_matrix_value ();
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
214
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
215 if (! error_state)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
216 {
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
217
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
218 if (nargout == 0 || nargout == 1)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
219 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
220 FloatComplexSCHUR result (ctmp, ord, false);
10617
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
221 retval(0) = mark_upper_triangular (result.schur_matrix ());
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
222 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
223 else
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
224 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
225 FloatComplexSCHUR result (ctmp, ord, true);
10617
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
226 retval(1) = mark_upper_triangular (result.schur_matrix ());
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
227 retval(0) = result.unitary_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
228 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
229 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
230 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
231 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
232 else
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
233 {
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
234 if (! force_complex && arg.is_real_type ())
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
235 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
236 Matrix tmp = arg.matrix_value ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
237
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
238 if (! error_state)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
239 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
240 if (nargout == 0 || nargout == 1)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
241 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
242 SCHUR result (tmp, ord, false);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
243 retval(0) = result.schur_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
244 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
245 else
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
246 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
247 SCHUR result (tmp, ord, true);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
248 retval(1) = result.schur_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
249 retval(0) = result.unitary_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
250 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
251 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
252 }
10607
f7501986e42d make schur more Matlab compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10155
diff changeset
253 else
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
254 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
255 ComplexMatrix ctmp = arg.complex_matrix_value ();
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
256
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
257 if (! error_state)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
258 {
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
259
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
260 if (nargout == 0 || nargout == 1)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
261 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
262 ComplexSCHUR result (ctmp, ord, false);
10617
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
263 retval(0) = mark_upper_triangular (result.schur_matrix ());
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
264 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
265 else
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
266 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
267 ComplexSCHUR result (ctmp, ord, true);
10617
9c9e07f5eb1c make schur mark triangular matrices on output
Jaroslav Hajek <highegg@gmail.com>
parents: 10607
diff changeset
268 retval(1) = mark_upper_triangular (result.schur_matrix ());
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
269 retval(0) = result.unitary_matrix ();
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
270 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
271 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9758
diff changeset
272 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
273 }
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
274
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
275 return retval;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
276 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
277
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
278 /*
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
279 %!test
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
280 %! a = [1, 2, 3; 4, 5, 9; 7, 8, 6];
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
281 %! [u, s] = schur (a);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
282 %! assert (u' * a * u, s, sqrt (eps));
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
283
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
284 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
285 %! a = single ([1, 2, 3; 4, 5, 9; 7, 8, 6]);
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
286 %! [u, s] = schur (a);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
287 %! assert (u' * a * u, s, sqrt (eps ("single")));
7814
87865ed7405f Second set of single precision test code and fix of resulting bugs
David Bateman <dbateman@free.fr>
parents: 7789
diff changeset
288
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
289 %!error schur ()
19050
b155fad47055 Fix error messages and %!fail tests for schur().
Rik <rik@octave.org>
parents: 17787
diff changeset
290 %!error schur (1,2,3)
b155fad47055 Fix error messages and %!fail tests for schur().
Rik <rik@octave.org>
parents: 17787
diff changeset
291 %!error [a,b,c] = schur (1)
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
292 %!error <argument must be a square matrix> schur ([1, 2, 3; 4, 5, 6])
19050
b155fad47055 Fix error messages and %!fail tests for schur().
Rik <rik@octave.org>
parents: 17787
diff changeset
293 %!error <wrong type argument 'cell'> schur ({1})
19068
f707835af867 Rewrite schur built-in test as a %!warning to stop failure during 'make check'
Rik <rik@octave.org>
parents: 19050
diff changeset
294 %!warning <incorrect ordered schur argument> schur ([1, 2; 3, 4], "bad_opt");
f707835af867 Rewrite schur built-in test as a %!warning to stop failure during 'make check'
Rik <rik@octave.org>
parents: 19050
diff changeset
295
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
296 */
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
297
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
298 DEFUN (rsf2csf, args, nargout,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
299 "-*- texinfo -*-\n\
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
300 @deftypefn {Function File} {[@var{U}, @var{T}] =} rsf2csf (@var{UR}, @var{TR})\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
301 Convert a real, upper quasi-triangular Schur@tie{}form @var{TR} to a complex,\n\
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
302 upper triangular Schur@tie{}form @var{T}.\n\
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
303 \n\
12642
f96b9b9f141b doc: Periodic grammarcheck and spellcheck of documentation.
Rik <octave@nomad.inbox5.com>
parents: 12584
diff changeset
304 Note that the following relations hold:\n\
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
305 \n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
306 @tex\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
307 $UR \\cdot TR \\cdot {UR}^T = U T U^{\\dagger}$ and\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
308 $U^{\\dagger} U$ is the identity matrix I.\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
309 @end tex\n\
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
310 @ifnottex\n\
17268
1c21f264d26f doc: Rename @xcode macro to @tcode (transpose code) for clarity.
Rik <rik@octave.org>
parents: 16920
diff changeset
311 @tcode{@var{UR} * @var{TR} * @var{UR}' = @var{U} * @var{T} * @var{U}'} and\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
312 @code{@var{U}' * @var{U}} is the identity matrix I.\n\
12584
7ef7e20057fa Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
313 @end ifnottex\n\
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
314 \n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
315 Note also that @var{U} and @var{T} are not unique.\n\
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
316 @seealso{schur}\n\
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
317 @end deftypefn")
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
318 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
319 octave_value_list retval;
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
320
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
321 if (args.length () == 2 && nargout <= 2)
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
322 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
323 if (! args(0).is_numeric_type ())
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
324 gripe_wrong_type_arg ("rsf2csf", args(0));
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
325 else if (! args(1).is_numeric_type ())
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
326 gripe_wrong_type_arg ("rsf2csf", args(1));
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
327 else if (args(0).is_complex_type () || args(1).is_complex_type ())
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
328 error ("rsf2csf: UR and TR must be real matrices");
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
329 else
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
330 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
331
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
332 if (args(0).is_single_type () || args(1).is_single_type ())
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
333 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
334 FloatMatrix u = args(0).float_matrix_value ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
335 FloatMatrix t = args(1).float_matrix_value ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
336 if (! error_state)
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
337 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
338 FloatComplexSCHUR cs (FloatSCHUR (t, u));
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
339
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
340 retval(1) = cs.schur_matrix ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
341 retval(0) = cs.unitary_matrix ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
342 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
343 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
344 else
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
345 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
346 Matrix u = args(0).matrix_value ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
347 Matrix t = args(1).matrix_value ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
348 if (! error_state)
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
349 {
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
350 ComplexSCHUR cs (SCHUR (t, u));
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
351
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
352 retval(1) = cs.schur_matrix ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
353 retval(0) = cs.unitary_matrix ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
354 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
355 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
356 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
357 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
358 else
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
359 print_usage ();
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
360
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
361 return retval;
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
362 }
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
363
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
364 /*
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
365 %!test
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
366 %! A = [1, 1, 1, 2; 1, 2, 1, 1; 1, 1, 3, 1; -2, 1, 1, 1];
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
367 %! [u, t] = schur (A);
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
368 %! [U, T] = rsf2csf (u, t);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
369 %! assert (norm (u * t * u' - U * T * U'), 0, 1e-12);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
370 %! assert (norm (A - U * T * U'), 0, 1e-12);
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
371
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
372 %!test
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
373 %! A = rand (10);
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
374 %! [u, t] = schur (A);
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
375 %! [U, T] = rsf2csf (u, t);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
376 %! assert (norm (tril (T, -1)), 0);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
377 %! assert (norm (U * U'), 1, 1e-14);
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
378
14460
6c3441f3146b Fix logm for complex matrix with real eigenvalues (bug #34893).
Marco Caliari <marco.caliari@univr.it>
parents: 14138
diff changeset
379 %!test
6c3441f3146b Fix logm for complex matrix with real eigenvalues (bug #34893).
Marco Caliari <marco.caliari@univr.it>
parents: 14138
diff changeset
380 %! A = [0, 1;-1, 0];
6c3441f3146b Fix logm for complex matrix with real eigenvalues (bug #34893).
Marco Caliari <marco.caliari@univr.it>
parents: 14138
diff changeset
381 %! [u, t] = schur (A);
6c3441f3146b Fix logm for complex matrix with real eigenvalues (bug #34893).
Marco Caliari <marco.caliari@univr.it>
parents: 14138
diff changeset
382 %! [U, T] = rsf2csf (u,t);
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14460
diff changeset
383 %! assert (U * T * U', A, 1e-14);
10822
23d2378512a0 implement rsf2csf
Jaroslav Hajek <highegg@gmail.com>
parents: 10617
diff changeset
384 */