annotate src/log.cc @ 515:e078f05f4aac

[project @ 1994-07-13 02:31:31 by jwe] Initial revision
author jwe
date Wed, 13 Jul 1994 02:31:31 +0000
parents
children b9284136189a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
515
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
1 // f-log.cc -*- C++ -*-
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
2 /*
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
3
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1994 John W. Eaton
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
5
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
7
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
11 later version.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
12
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
16 for more details.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
17
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
21
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
22 */
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
23
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
25 #include "config.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
26 #endif
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
27
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
28 #include "EIG.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
29
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
30 #include "tree-const.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
31 #include "user-prefs.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
32 #include "error.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
33 #include "gripes.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
34 #include "f-log.h"
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
35
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
36 // XXX FIXME XXX -- the next two functions (and expm) should really be just
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
37 // one...
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
38
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
39 Octave_object
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
40 matrix_log (const tree_constant& a)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
41 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
42 Octave_object retval (1);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
43
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
44 tree_constant tmp = a.make_numeric ();;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
45
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
46 if (tmp.rows () == 0 || tmp.columns () == 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
47 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
48 int flag = user_pref.propagate_empty_matrices;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
49 if (flag != 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
50 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
51 if (flag < 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
52 gripe_empty_arg ("logm", 0);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
53 Matrix m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
54 retval(0) = m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
55 return retval;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
56 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
57 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
58 gripe_empty_arg ("logm", 1);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
59 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
60
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
61 switch (tmp.const_type ())
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
62 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
63 case tree_constant_rep::matrix_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
64 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
65 Matrix m = tmp.matrix_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
66
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
67 int nr = m.rows ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
68 int nc = m.columns ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
69
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
70 if (nr == 0 || nc == 0 || nr != nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
71 gripe_square_matrix_required ("logm");
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
72 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
73 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
74 EIG m_eig (m);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
75 ComplexColumnVector lambda (m_eig.eigenvalues ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
76 ComplexMatrix Q (m_eig.eigenvectors ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
77
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
78 for (int i = 0; i < nr; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
79 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
80 Complex elt = lambda.elem (i);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
81 if (imag (elt) == 0.0 && real (elt) > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
82 lambda.elem (i) = log (real (elt));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
83 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
84 lambda.elem (i) = log (elt);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
85 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
86
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
87 ComplexDiagMatrix D (lambda);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
88 ComplexMatrix result = Q * D * Q.inverse ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
89
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
90 retval(0) = result;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
91 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
92 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
93 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
94 case tree_constant_rep::complex_matrix_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
95 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
96 ComplexMatrix m = tmp.complex_matrix_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
97
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
98 int nr = m.rows ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
99 int nc = m.columns ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
100
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
101 if (nr == 0 || nc == 0 || nr != nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
102 gripe_square_matrix_required ("logm");
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
103 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
104 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
105 EIG m_eig (m);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
106 ComplexColumnVector lambda (m_eig.eigenvalues ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
107 ComplexMatrix Q (m_eig.eigenvectors ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
108
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
109 for (int i = 0; i < nr; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
110 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
111 Complex elt = lambda.elem (i);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
112 if (imag (elt) == 0.0 && real (elt) > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
113 lambda.elem (i) = log (real (elt));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
114 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
115 lambda.elem (i) = log (elt);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
116 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
117
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
118 ComplexDiagMatrix D (lambda);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
119 ComplexMatrix result = Q * D * Q.inverse ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
120
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
121 retval(0) = result;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
122 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
123 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
124 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
125 case tree_constant_rep::scalar_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
126 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
127 double d = tmp.double_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
128 if (d > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
129 retval(0) = log (d);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
130 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
131 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
132 Complex dtmp (d);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
133 retval(0) = log (dtmp);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
134 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
135 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
136 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
137 case tree_constant_rep::complex_scalar_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
138 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
139 Complex c = tmp.complex_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
140 retval(0) = log (c);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
141 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
142 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
143 default:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
144 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
145 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
146 return retval;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
147 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
148
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
149 Octave_object
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
150 matrix_sqrt (const tree_constant& a)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
151 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
152 Octave_object retval (1);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
153
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
154 tree_constant tmp = a.make_numeric ();;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
155
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
156 if (tmp.rows () == 0 || tmp.columns () == 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
157 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
158 int flag = user_pref.propagate_empty_matrices;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
159 if (flag != 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
160 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
161 if (flag < 0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
162 gripe_empty_arg ("sqrtm", 0);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
163 Matrix m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
164 retval(0) = m;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
165 return retval;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
166 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
167 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
168 gripe_empty_arg ("sqrtm", 1);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
169 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
170
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
171 switch (tmp.const_type ())
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
172 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
173 case tree_constant_rep::matrix_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
174 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
175 Matrix m = tmp.matrix_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
176
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
177 int nr = m.rows ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
178 int nc = m.columns ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
179
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
180 if (nr == 0 || nc == 0 || nr != nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
181 gripe_square_matrix_required ("sqrtm");
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
182 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
183 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
184 EIG m_eig (m);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
185 ComplexColumnVector lambda (m_eig.eigenvalues ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
186 ComplexMatrix Q (m_eig.eigenvectors ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
187
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
188 for (int i = 0; i < nr; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
189 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
190 Complex elt = lambda.elem (i);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
191 if (imag (elt) == 0.0 && real (elt) > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
192 lambda.elem (i) = sqrt (real (elt));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
193 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
194 lambda.elem (i) = sqrt (elt);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
195 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
196
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
197 ComplexDiagMatrix D (lambda);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
198 ComplexMatrix result = Q * D * Q.inverse ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
199
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
200 retval(0) = result;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
201 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
202 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
203 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
204 case tree_constant_rep::complex_matrix_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
205 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
206 ComplexMatrix m = tmp.complex_matrix_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
207
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
208 int nr = m.rows ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
209 int nc = m.columns ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
210
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
211 if (nr == 0 || nc == 0 || nr != nc)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
212 gripe_square_matrix_required ("sqrtm");
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
213 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
214 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
215 EIG m_eig (m);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
216 ComplexColumnVector lambda (m_eig.eigenvalues ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
217 ComplexMatrix Q (m_eig.eigenvectors ());
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
218
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
219 for (int i = 0; i < nr; i++)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
220 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
221 Complex elt = lambda.elem (i);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
222 if (imag (elt) == 0.0 && real (elt) > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
223 lambda.elem (i) = sqrt (real (elt));
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
224 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
225 lambda.elem (i) = sqrt (elt);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
226 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
227
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
228 ComplexDiagMatrix D (lambda);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
229 ComplexMatrix result = Q * D * Q.inverse ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
230
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
231 retval(0) = result;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
232 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
233 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
234 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
235 case tree_constant_rep::scalar_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
236 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
237 double d = tmp.double_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
238 if (d > 0.0)
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
239 retval(0) = sqrt (d);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
240 else
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
241 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
242 Complex dtmp (d);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
243 retval(0) = sqrt (dtmp);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
244 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
245 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
246 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
247 case tree_constant_rep::complex_scalar_constant:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
248 {
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
249 Complex c = tmp.complex_value ();
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
250 retval(0) = log (c);
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
251 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
252 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
253 default:
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
254 break;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
255 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
256 return retval;
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
257 }
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
258
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
259 /*
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
260 ;;; Local Variables: ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
261 ;;; mode: C++ ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
262 ;;; page-delimiter: "^/\\*" ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
263 ;;; End: ***
e078f05f4aac [project @ 1994-07-13 02:31:31 by jwe]
jwe
parents:
diff changeset
264 */