Mercurial > octave
annotate src/DLD-FUNCTIONS/balance.cc @ 9821:84199c9fc69c
fix bug in balance
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 17 Nov 2009 04:08:23 +0100 |
parents | 16f53d29049f |
children | 40dfc0c99116 |
rev | line source |
---|---|
2928 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2005, 2006, |
4 2007 John W. Eaton | |
9245 | 5 Copyright (C) 2008, 2009 Jaroslav Hajek |
2928 | 6 |
7 This file is part of Octave. | |
8 | |
9 Octave is free software; you can redistribute it and/or modify it | |
10 under the terms of the GNU General Public License as published by the | |
7016 | 11 Free Software Foundation; either version 3 of the License, or (at your |
12 option) any later version. | |
2928 | 13 |
14 Octave is distributed in the hope that it will be useful, but WITHOUT | |
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
17 for more details. | |
18 | |
19 You should have received a copy of the GNU General Public License | |
7016 | 20 along with Octave; see the file COPYING. If not, see |
21 <http://www.gnu.org/licenses/>. | |
2928 | 22 |
23 */ | |
24 | |
3911 | 25 // Author: A. S. Hodel <scotte@eng.auburn.edu> |
2928 | 26 |
27 #ifdef HAVE_CONFIG_H | |
28 #include <config.h> | |
29 #endif | |
30 | |
31 #include <string> | |
32 | |
33 #include "CmplxAEPBAL.h" | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
34 #include "fCmplxAEPBAL.h" |
2928 | 35 #include "dbleAEPBAL.h" |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
36 #include "floatAEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
37 #include "CmplxGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
38 #include "fCmplxGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
39 #include "dbleGEPBAL.h" |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
40 #include "floatGEPBAL.h" |
4153 | 41 #include "quit.h" |
2928 | 42 |
43 #include "defun-dld.h" | |
44 #include "error.h" | |
3181 | 45 #include "f77-fcn.h" |
2928 | 46 #include "gripes.h" |
47 #include "oct-obj.h" | |
48 #include "utils.h" | |
49 | |
50 DEFUN_DLD (balance, args, nargout, | |
3548 | 51 "-*- texinfo -*-\n\ |
3372 | 52 @deftypefn {Loadable Function} {@var{aa} =} balance (@var{a}, @var{opt})\n\ |
53 @deftypefnx {Loadable Function} {[@var{dd}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ | |
9048
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
54 @deftypefnx {Loadable Function} {[@var{d}, @var{p}, @var{aa}] =} balance (@var{a}, @var{opt})\n\ |
3402 | 55 @deftypefnx {Loadable Function} {[@var{cc}, @var{dd}, @var{aa}, @var{bb}] =} balance (@var{a}, @var{b}, @var{opt})\n\ |
2928 | 56 \n\ |
7096 | 57 Compute @code{aa = dd \\ a * dd} in which @code{aa} is a matrix whose\n\ |
58 row and column norms are roughly equal in magnitude, and\n\ | |
59 @code{dd} = @code{p * d}, in which @code{p} is a permutation\n\ | |
3372 | 60 matrix and @code{d} is a diagonal matrix of powers of two. This allows\n\ |
61 the equilibration to be computed without roundoff. Results of\n\ | |
62 eigenvalue calculation are typically improved by balancing first.\n\ | |
2928 | 63 \n\ |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
64 If two output values are requested, @code{balance} returns \n\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
9048
diff
changeset
|
65 the diagonal @code{d} and the permutation @code{p} separately as vectors. \n\ |
9821 | 66 In this case, @code{dd = eye(n)(:,p) * diag (d)}, where @code{n} is the matrix \n\ |
9064
7c02ec148a3c
Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents:
9048
diff
changeset
|
67 size. \n\ |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
68 \n\ |
7096 | 69 If four output values are requested, compute @code{aa = cc*a*dd} and\n\ |
70 @code{bb = cc*b*dd)}, in which @code{aa} and @code{bb} have non-zero\n\ | |
3372 | 71 elements of approximately the same magnitude and @code{cc} and @code{dd}\n\ |
72 are permuted diagonal matrices as in @code{dd} for the algebraic\n\ | |
73 eigenvalue problem.\n\ | |
74 \n\ | |
7096 | 75 The eigenvalue balancing option @code{opt} may be one of:\n\ |
2928 | 76 \n\ |
3372 | 77 @table @asis\n\ |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
78 @item @code{\"noperm\"}, @code{\"S\"}\n\ |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
79 Scale only; do not permute.\n\ |
3372 | 80 \n\ |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
81 @item @code{\"noscal\"}, @code{\"P\"}\n\ |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
82 Permute only; do not scale.\n\ |
3372 | 83 @end table\n\ |
2928 | 84 \n\ |
9209
923c7cb7f13f
Simplify TeXinfo files by eliminating redundant @iftex followed by @tex construction.
Rik <rdrider0-list@yahoo.com>
parents:
9064
diff
changeset
|
85 Algebraic eigenvalue balancing uses standard @sc{lapack} routines.\n\ |
3372 | 86 \n\ |
87 Generalized eigenvalue problem balancing uses Ward's algorithm\n\ | |
88 (SIAM Journal on Scientific and Statistical Computing, 1981).\n\ | |
89 @end deftypefn") | |
2928 | 90 { |
91 octave_value_list retval; | |
92 | |
93 int nargin = args.length (); | |
94 | |
95 if (nargin < 1 || nargin > 3 || nargout < 0 || nargout > 4) | |
96 { | |
5823 | 97 print_usage (); |
2928 | 98 return retval; |
99 } | |
100 | |
3181 | 101 // determine if it's AEP or GEP |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
102 bool AEPcase = nargin == 1 || args(1).is_string (); |
2928 | 103 |
3181 | 104 // problem dimension |
5275 | 105 octave_idx_type nn = args(0).rows (); |
2928 | 106 |
3181 | 107 if (nn != args(0).columns()) |
3185 | 108 { |
109 gripe_square_matrix_required ("balance"); | |
110 return retval; | |
111 } | |
2928 | 112 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
113 bool isfloat = args(0).is_single_type () || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
114 (! AEPcase && args(1).is_single_type()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
115 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
116 bool complex_case = (args(0).is_complex_type () || |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
117 (! AEPcase && args(1).is_complex_type ())); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
118 |
2928 | 119 // Extract argument 1 parameter for both AEP and GEP. |
120 Matrix aa; | |
121 ComplexMatrix caa; | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
122 FloatMatrix faa; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
123 FloatComplexMatrix fcaa; |
3185 | 124 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
125 if (isfloat) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
126 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
127 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
128 fcaa = args(0).float_complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
129 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
130 faa = args(0).float_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
131 } |
3185 | 132 else |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
133 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
134 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
135 caa = args(0).complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
136 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
137 aa = args(0).matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
138 } |
3185 | 139 |
140 if (error_state) | |
141 return retval; | |
2928 | 142 |
143 // Treat AEP/GEP cases. | |
3185 | 144 if (AEPcase) |
145 { | |
146 // Algebraic eigenvalue problem. | |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
147 bool noperm = false, noscal = false; |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
148 if (nargin > 1) |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
149 { |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
150 std::string a1s = args(1).string_value (); |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
151 noperm = a1s == "noperm" || a1s == "S"; |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
152 noscal = a1s == "noscal" || a1s == "P"; |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
153 } |
3185 | 154 |
155 // balance the AEP | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
156 if (isfloat) |
3185 | 157 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
158 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
159 { |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
160 FloatComplexAEPBALANCE result (fcaa, noperm, noscal); |
2928 | 161 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
162 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
163 retval(0) = result.balanced_matrix (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
164 else if (nargout == 2) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
165 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
166 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
167 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
168 } |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
169 else |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
170 { |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
171 retval(2) = result.balanced_matrix (); |
9048
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
172 retval(0) = result.scaling_vector (); |
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
173 retval(1) = result.permuting_vector (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
174 } |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
175 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
176 } |
3185 | 177 else |
178 { | |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
179 FloatAEPBALANCE result (faa, noperm, noscal); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
180 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
181 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
182 retval(0) = result.balanced_matrix (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
183 else if (nargout == 2) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
184 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
185 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
186 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
187 } |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
188 else |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
189 { |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
190 retval(2) = result.balanced_matrix (); |
9048
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
191 retval(0) = result.scaling_vector (); |
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
192 retval(1) = result.permuting_vector (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
193 } |
3185 | 194 } |
195 } | |
3181 | 196 else |
3185 | 197 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
198 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
199 { |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
200 ComplexAEPBALANCE result (caa, noperm, noscal); |
3185 | 201 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
202 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
203 retval(0) = result.balanced_matrix (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
204 else if (nargout == 2) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
205 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
206 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
207 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
208 } |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
209 else |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
210 { |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
211 retval(2) = result.balanced_matrix (); |
9048
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
212 retval(0) = result.scaling_vector (); |
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
213 retval(1) = result.permuting_vector (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
214 } |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
215 } |
3185 | 216 else |
217 { | |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
218 AEPBALANCE result (aa, noperm, noscal); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
219 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
220 if (nargout == 0 || nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
221 retval(0) = result.balanced_matrix (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
222 else if (nargout == 2) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
223 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
224 retval(1) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
225 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
226 } |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
227 else |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
228 { |
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
229 retval(2) = result.balanced_matrix (); |
9048
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
230 retval(0) = result.scaling_vector (); |
867d5d1aed06
swap out args in balance for M*b compat
Jaroslav Hajek <highegg@gmail.com>
parents:
8386
diff
changeset
|
231 retval(1) = result.permuting_vector (); |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
232 } |
3185 | 233 } |
234 } | |
3181 | 235 } |
236 else | |
237 { | |
8386
a5e080076778
make balance more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
7789
diff
changeset
|
238 std::string bal_job; |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
239 if (nargout == 1) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
240 warning ("balance: used GEP, should have two output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
241 |
3185 | 242 // Generalized eigenvalue problem. |
243 if (nargin == 2) | |
244 bal_job = "B"; | |
245 else if (args(2).is_string ()) | |
246 bal_job = args(2).string_value (); | |
247 else | |
248 { | |
249 error ("balance: GEP argument 3 must be a string"); | |
250 return retval; | |
251 } | |
252 | |
253 if ((nn != args(1).columns ()) || (nn != args(1).rows ())) | |
254 { | |
255 gripe_nonconformant (); | |
256 return retval; | |
257 } | |
258 | |
259 Matrix bb; | |
260 ComplexMatrix cbb; | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
261 FloatMatrix fbb; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
262 FloatComplexMatrix fcbb; |
3185 | 263 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
264 if (isfloat) |
3185 | 265 { |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
266 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
267 fcbb = args(1).float_complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
268 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
269 fbb = args(1).float_matrix_value (); |
3185 | 270 } |
271 else | |
272 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
273 if (complex_case) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
274 cbb = args(1).complex_matrix_value (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
275 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
276 bb = args(1).matrix_value (); |
3185 | 277 } |
4153 | 278 |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
279 // balance the GEP |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
280 if (isfloat) |
3185 | 281 { |
282 if (complex_case) | |
283 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
284 FloatComplexGEPBALANCE result (fcaa, fcbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
285 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
286 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
287 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
288 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
289 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
290 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
291 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
292 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
293 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
294 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
295 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
296 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
297 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
298 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
299 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
300 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
301 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
302 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
303 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
304 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
305 } |
3185 | 306 } |
307 else | |
308 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
309 FloatGEPBALANCE result (faa, fbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
310 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
311 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
312 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
313 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
314 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
315 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
316 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
317 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
318 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
319 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
320 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
321 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
322 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
323 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
324 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
325 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
326 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
327 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
328 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
329 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
330 } |
3185 | 331 } |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
332 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
333 else |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
334 { |
3185 | 335 if (complex_case) |
336 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
337 ComplexGEPBALANCE result (caa, cbb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
338 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
339 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
340 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
341 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
342 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
343 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
344 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
345 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
346 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
347 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
348 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
349 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
350 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
351 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
352 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
353 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
354 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
355 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
356 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
357 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
358 } |
3185 | 359 } |
360 else | |
361 { | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
362 GEPBALANCE result (aa, bb, bal_job); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
363 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
364 switch (nargout) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
365 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
366 case 4: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
367 retval(3) = result.balanced_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
368 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
369 case 3: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
370 retval(2) = result.balanced_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
371 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
372 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
373 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
374 case 2: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
375 retval(1) = result.balancing_matrix2 (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
376 // fall through |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
377 case 1: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
378 retval(0) = result.balancing_matrix (); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
379 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
380 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
381 error ("balance: invalid number of output arguments"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
382 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7482
diff
changeset
|
383 } |
3185 | 384 } |
385 } | |
2928 | 386 } |
3185 | 387 |
2928 | 388 return retval; |
389 } | |
390 | |
391 /* | |
392 ;;; Local Variables: *** | |
393 ;;; mode: C++ *** | |
394 ;;; End: *** | |
395 */ |