annotate src/DLD-FUNCTIONS/balance.cc @ 3181:3f6a813eb09e

[project @ 1998-09-25 02:50:29 by jwe]
author jwe
date Fri, 25 Sep 1998 02:53:39 +0000
parents f657159c8152
children 9580887dd160
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
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
3 Copyright (C) 1996, 1997 John W. Eaton
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
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
10 later version.
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
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, write to the Free
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
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 // Written by A. S. Hodel <scotte@eng.auburn.edu>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
24
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
25 #ifdef HAVE_CONFIG_H
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
26 #include <config.h>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
27 #endif
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 <string>
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
30
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
31 #include "CmplxAEPBAL.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
32 #include "CmplxAEPBAL.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
33 #include "dbleAEPBAL.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
34 #include "dbleAEPBAL.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
35
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
36 #include "defun-dld.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
37 #include "error.h"
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
38 #include "f77-fcn.h"
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
39 #include "gripes.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
40 #include "oct-obj.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
41 #include "utils.h"
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
42
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
43 extern "C"
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
44 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
45 int F77_FCN( dggbal, DGGBAL) (const char* JOB, const int& N,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
46 double* A, const int& LDA, double* B, const int& LDB,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
47 int& ILO, int & IHI, double* LSCALE,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
48 double* RSCALE, double* WORK, int& INFO, long );
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
49
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
50 int F77_FCN( dggbak, DGGBAK) (const char* JOB, const char* SIDE,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
51 const int& N, const int& ILO, const int& IHI,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
52 double* LSCALE, double* RSCALE, int& M,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
53 double* V, const int& LDV, int& INFO, long, long);
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
54
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
55 int F77_FCN( zggbal, ZGGBAL) ( const char* JOB, const int& N,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
56 Complex* A, const int& LDA, Complex* B, const int& LDB,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
57 int& ILO, int & IHI, double* LSCALE,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
58 double* RSCALE, double* WORK, int& INFO, long );
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
59 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
60
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
61 DEFUN_DLD (balance, args, nargout,
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
62 "AA = balance (A [, OPT]) or [[DD,] AA] = balance (A [, OPT])\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
63 \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
64 generalized eigenvalue problem:\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
65 \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
66 [cc, dd, aa, bb] = balance (a, b [, opt])\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
67 \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
68 where OPT is an optional single character argument as follows: \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
69 \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
70 N: no balancing; arguments copied, transformation(s) set to identity\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
71 P: permute argument(s) to isolate eigenvalues where possible\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
72 S: scale to improve accuracy of computed eigenvalues\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
73 B: (default) permute and scale, in that order. Rows/columns\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
74 of a (and b) that are isolated by permutation are not scaled\n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
75 \n\
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
76 [DD, AA] = balance (A, OPT) returns aa = dd*a*dd,\n\
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
77 \n\
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
78 [CC, DD, AA, BB] = balance (A, B, OPT) returns AA (BB) = CC*A*DD (CC*B*DD)")
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
79 {
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
80
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
81 octave_value_list retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
82
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
83 int nargin = args.length ();
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
84
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
85 if (nargin < 1 || nargin > 3 || nargout < 0 || nargout > 4)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
86 {
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
87 print_usage ("balance");
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
88 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
89 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
90
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
91 // determine if it's AEP or GEP
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
92 int AEPcase = (nargin == 1 ? 1 : args(1).is_string() );
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
93 string bal_job;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
94
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
95 // problem dimension
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
96 int nn = args(0).rows ();
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
97
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
98 int arg_is_empty = empty_arg ("balance", nn, args(0).columns());
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
99
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
100 if (arg_is_empty < 0)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
101 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
102 if (arg_is_empty > 0)
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
103 return octave_value_list (2, Matrix ());
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
104
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
105 if (nn != args(0).columns())
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
106 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
107 gripe_square_matrix_required ("balance");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
108 return retval;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
109 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
110
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
111 // Extract argument 1 parameter for both AEP and GEP.
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
112 Matrix aa;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
113 ComplexMatrix caa;
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
114 if (args(0).is_complex_type ()) caa = args(0).complex_matrix_value ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
115 else aa = args(0).matrix_value ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
116 if (error_state) return retval;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
117
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
118 // Treat AEP/GEP cases.
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
119 if(AEPcase)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
120 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
121 // Algebraic eigenvalue problem.
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
122 if(nargin == 1)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
123 bal_job = "B";
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
124 else if(args(1).is_string())
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
125 bal_job = args(1).string_value();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
126 // the next line should never execute, but better safe than sorry.
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
127 else error("balance: AEP argument 2 must be a string");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
128
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
129 // balance the AEP
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
130 if (args(0).is_complex_type ())
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
131 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
132 ComplexAEPBALANCE result (caa, bal_job);
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
133
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
134 if (nargout == 0 || nargout == 1)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
135 retval(0) = result.balanced_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
136 else
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
137 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
138 retval(1) = result.balanced_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
139 retval(0) = result.balancing_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
140 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
141 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
142 else
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
143 {
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
144 AEPBALANCE result (aa, bal_job);
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
145
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
146 if (nargout == 0 || nargout == 1)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
147 retval(0) = result.balanced_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
148 else
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
149 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
150 retval(1) = result.balanced_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
151 retval(0) = result.balancing_matrix ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
152 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
153 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
154 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
155 //
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
156 // end of AEP case, now do GEP case
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
157 else
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
158 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
159 // Generalized eigenvalue problem.
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
160 if(nargin == 2)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
161 bal_job = "B";
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
162 else if(args(2).is_string())
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
163 bal_job = args(2).string_value();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
164 else error("balance: GEP argument 3 must be a string");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
165
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
166 if( (nn != args(1).columns()) || (nn != args(1).rows() ) )
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
167 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
168 gripe_nonconformant ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
169 return retval;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
170 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
171 Matrix bb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
172 ComplexMatrix cbb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
173 if (args(1).is_complex_type ()) cbb = args(1).complex_matrix_value ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
174 else bb = args(1).matrix_value ();
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
175 if (error_state) return retval;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
176
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
177 //
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
178 // Both matrices loaded, now let's check what kind of arithmetic:
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
179 // first, declare variables used in both the real and complex case
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
180 int ilo, ihi, info;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
181 RowVector lscale(nn), rscale(nn), work(6*nn);
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
182 char job = bal_job[0];
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
183 static int complex_case = (args(0).is_complex_type()
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
184 || args(1).is_complex_type());
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
185
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
186 // now balance
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
187 if (complex_case)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
188 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
189 if (args(0).is_real_type ()) caa = aa;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
190 if (args(1).is_real_type ()) cbb = bb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
191
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
192 F77_XFCN( zggbal, ZGGBAL, ( &job, nn, caa.fortran_vec(), nn,
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
193 cbb.fortran_vec(), nn, ilo, ihi, lscale.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
194 rscale.fortran_vec(), work.fortran_vec(), info, 1L));
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
195 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
196 else // real matrices case
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
197 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
198 F77_XFCN( dggbal, DGGBAL, (&job, nn, aa.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
199 nn, bb.fortran_vec() , nn, ilo, ihi, lscale.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
200 rscale.fortran_vec(), work.fortran_vec(), info , 1L));
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
201
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
202 if(f77_exception_encountered)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
203 (*current_liboctave_error_handler)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
204 ("unrecoverable error in balance GEP");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
205 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
206
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
207 // Since we just want the balancing matrices, we can use dggbal
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
208 // for both the real and complex cases;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
209 Matrix Pl(nn,nn), Pr(nn,nn);
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
210 for(int ii=0; ii < nn ; ii++)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
211 for( int jj=0; jj < nn ; jj++)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
212 Pl(ii,jj) = Pr(ii,jj) = (ii == jj ? 1.0 : 0.0);
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
213
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
214 // left first
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
215 F77_XFCN( dggbak, DGGBAK, (&job, "L",
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
216 nn, ilo, ihi, lscale.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
217 rscale.fortran_vec(), nn, Pl.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
218 nn, info, 1L, 1L));
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
219
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
220 if(f77_exception_encountered)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
221 (*current_liboctave_error_handler)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
222 ("unrecoverable error in balance GEP(L)");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
223
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
224 // then right
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
225 F77_XFCN(dggbak, DGGBAK, (&job, "R",
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
226 nn, ilo, ihi, lscale.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
227 rscale.fortran_vec(), nn, Pr.fortran_vec(),
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
228 nn, info, 1L, 1L));
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
229 if(f77_exception_encountered)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
230 (*current_liboctave_error_handler)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
231 ("unrecoverable error in balance GEP(R)");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
232
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
233 switch (nargout)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
234 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
235 case 0:
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
236 case 1:
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
237 warning ("balance: used GEP, should have two output arguments");
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
238 if(complex_case)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
239 retval(0) = caa;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
240 else
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
241 retval(0) = aa;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
242 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
243
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
244 case 2:
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
245 if(complex_case)
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
246 {
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
247 retval(1) = cbb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
248 retval(0) = caa;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
249 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
250 else
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
251 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
252 retval(1) = bb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
253 retval(0) = aa;
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
254 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
255 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
256
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
257 case 4:
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
258 if(complex_case)
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
259 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
260 retval(3) = cbb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
261 retval(2) = caa;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
262 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
263 else
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
264 {
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
265 retval(3) = bb;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
266 retval(2) = aa;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
267 }
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
268 retval(1) = Pr;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
269 retval(0) = Pl.transpose(); // so that aa_bal = cc*aa*dd, etc.
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
270 break;
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
271
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
272 default:
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
273 error ("balance: invalid number of output arguments");
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
274 break;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
275 }
3181
3f6a813eb09e [project @ 1998-09-25 02:50:29 by jwe]
jwe
parents: 3179
diff changeset
276 }
2928
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
277 return retval;
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
278 }
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
279
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
280 /*
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
281 ;;; Local Variables: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
282 ;;; mode: C++ ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
283 ;;; End: ***
295f037b4b3e [project @ 1997-05-05 05:32:33 by jwe]
jwe
parents:
diff changeset
284 */