annotate liboctave/Matrix-ext.cc @ 182:2db13bf4f3e2

[project @ 1993-10-23 22:51:34 by jwe]
author jwe
date Sat, 23 Oct 1993 22:51:34 +0000
parents 2cd2476fb32d
children 1a48a1b91489
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1 // Extra Matrix manipulations. -*- C++ -*-
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
2 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
4 Copyright (C) 1992 John W. Eaton
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
5
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
6 This file is part of Octave.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
7
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
11 later version.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
12
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
16 for more details.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
17
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
21
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
22 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
23
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
24 #ifdef __GNUG__
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
25 #pragma implementation
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
26 #endif
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
27
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
28 #include "Matrix.h"
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
29 #include "mx-inlines.cc"
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
30
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
31 /*
22
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
32 * AEPBALANCE operations
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
33 */
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
34
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
35 int
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
36 AEPBALANCE::init (const Matrix& a, const char *balance_job)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
37 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
38 if (a.nr != a.nc)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
39 FAIL;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
40
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
41 int n = a.nc;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
42
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
43 // Parameters for balance call.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
44
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
45 int info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
46 int ilo;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
47 int ihi;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
48 double *scale = new double [n];
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
49
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
50 // Copy matrix into local structure.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
51
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
52 balanced_mat = a;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
53
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
54 F77_FCN (dgebal) (balance_job, &n, balanced_mat.fortran_vec (),
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
55 &n, &ilo, &ihi, scale, &info, 1L, 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
56
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
57 // Initialize balancing matrix to identity.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
58
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
59 balancing_mat = Matrix (n, n, 0.0);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
60 for (int i = 0; i < n; i++)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
61 balancing_mat.elem (i ,i) = 1.0;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
62
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
63 F77_FCN (dgebak) (balance_job, "R", &n, &ilo, &ihi, scale, &n,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
64 balancing_mat.fortran_vec (), &n, &info, 1L, 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
65
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
66 delete [] scale;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
67
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
68 return info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
69 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
70
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
71 int
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
72 ComplexAEPBALANCE::init (const ComplexMatrix& a, const char *balance_job)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
73 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
74
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
75 int n = a.nc;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
76
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
77 // Parameters for balance call.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
78
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
79 int info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
80 int ilo;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
81 int ihi;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
82 double *scale = new double [n];
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
83
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
84 // Copy matrix into local structure.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
85
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
86 balanced_mat = a;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
87
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
88 F77_FCN (zgebal) (balance_job, &n, balanced_mat.fortran_vec (),
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
89 &n, &ilo, &ihi, scale, &info, 1L, 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
90
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
91 // Initialize balancing matrix to identity.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
92
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
93 balancing_mat = Matrix (n, n, 0.0);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
94 for (int i = 0; i < n; i++)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
95 balancing_mat (i, i) = 1.0;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
96
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
97 F77_FCN (zgebak) (balance_job, "R", &n, &ilo, &ihi, scale, &n,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
98 balancing_mat.fortran_vec(), &n, &info, 1L, 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
99
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
100 delete [] scale;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
101
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
102 return info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
103 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
104
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
105 /*
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
106 * GEPBALANCE operations
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
107 */
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
108
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
109 int
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
110 GEPBALANCE::init (const Matrix& a, const Matrix& b, const char *balance_job)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
111 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
112 if (a.nr != a.nc || a.nr != b.nr || b.nr != b.nc)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
113 FAIL;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
114
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
115 int n = a.nc;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
116
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
117 // Parameters for balance call.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
118
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
119 int info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
120 int ilo;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
121 int ihi;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
122 double *cscale = new double [n];
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
123 double *cperm = new double [n];
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
124 Matrix wk (n, 6, 0.0);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
125
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
126 // Back out the permutations:
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
127 //
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
128 // cscale contains the exponents of the column scaling factors in its
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
129 // ilo through ihi locations and the reducing column permutations in
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
130 // its first ilo-1 and its ihi+1 through n locations.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
131 //
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
132 // cperm contains the column permutations applied in grading the a and b
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
133 // submatrices in its ilo through ihi locations.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
134 //
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
135 // wk contains the exponents of the row scaling factors in its ilo
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
136 // through ihi locations, the reducing row permutations in its first
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
137 // ilo-1 and its ihi+1 through n locations, and the row permutations
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
138 // applied in grading the a and b submatrices in its n+ilo through
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
139 // n+ihi locations.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
140
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
141 // Copy matrices into local structure.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
142
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
143 balanced_a_mat = a;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
144 balanced_b_mat = b;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
145
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
146 // Initialize balancing matrices to identity.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
147
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
148 left_balancing_mat = Matrix(n,n,0.0);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
149 for (int i = 0; i < n; i++)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
150 left_balancing_mat (i, i) = 1.0;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
151
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
152 right_balancing_mat = left_balancing_mat;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
153
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
154 // Check for permutation option.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
155
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
156 if (*balance_job == 'P' || *balance_job == 'B')
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
157 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
158 F77_FCN(reduce)(&n, &n, balanced_a_mat.fortran_vec (),
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
159 &n, balanced_b_mat.fortran_vec (), &ilo, &ihi,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
160 cscale, wk.fortran_vec ());
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
161 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
162 else
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
163 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
164
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
165 // Set up for scaling later.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
166
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
167 ilo = 1;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
168 ihi = n;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
169 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
170
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
171 // Check for scaling option.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
172
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
173 if ((*balance_job == 'S' || *balance_job == 'B') && ilo != ihi)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
174 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
175 F77_FCN(scaleg)(&n, &n, balanced_a_mat.fortran_vec (),
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
176 &n, balanced_b_mat.fortran_vec (), &ilo, &ihi,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
177 cscale, cperm, wk.fortran_vec ());
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
178 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
179 else
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
180 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
181
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
182 // Set scaling data to 0's.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
183
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
184 for (int tmp = ilo-1; tmp < ihi; tmp++)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
185 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
186 cscale[tmp] = 0.0;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
187 wk.elem(tmp,0) = 0.0;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
188 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
189 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
190
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
191 // Scaleg returns exponents, not values, so...
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
192
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
193 for (int tmp = ilo-1; tmp < ihi; tmp++)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
194 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
195 cscale[tmp] = pow(2.0,cscale[tmp]);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
196 wk.elem(tmp,0) = pow(2.0,-wk.elem(tmp,0));
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
197 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
198
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
199 // Column permutations/scaling.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
200
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
201 F77_FCN (dgebak) (balance_job, "R", &n, &ilo, &ihi, cscale, &n,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
202 right_balancing_mat.fortran_vec (), &n, &info, 1L,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
203 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
204
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
205 // Row permutations/scaling.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
206
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
207 F77_FCN (dgebak) (balance_job, "L", &n, &ilo, &ihi, &wk.elem (0, 0), &n,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
208 left_balancing_mat.fortran_vec (), &n, &info, 1L, 1L);
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
209
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
210 // XXX FIXME XXX --- these four lines need to be added and debugged.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
211 // GEPBALANCE::init will work without them, though, so here they are.
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
212
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
213 #if 0
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
214 if ((*balance_job == 'P' || *balance_job == 'B') && ilo != ihi)
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
215 {
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
216 F77_FCN (gradeq) (&n, &n, balanced_a_mat.fortran_vec (),
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
217 &n, balanced_b_mat.fortran_vec (), &ilo, &ihi,
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
218 cperm, &wk.elem (0, 1));
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
219 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
220 #endif
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
221
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
222 // Transpose for aa = cc*a*dd convention...
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
223 left_balancing_mat = left_balancing_mat.transpose ();
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
224
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
225 delete [] cscale;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
226 delete [] cperm;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
227
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
228 return info;
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
229 }
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
230
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
231 /*
182
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
232 * CHOL stuff
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
233 */
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
234
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
235 int
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
236 CHOL::init (const Matrix& a)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
237 {
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
238 if (a.nr != a.nc)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
239 FAIL;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
240
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
241 char uplo = 'U';
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
242
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
243 int n = a.nc;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
244 int info;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
245
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
246 double *h = dup (a.data, a.len);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
247
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
248 F77_FCN (dpotrf) (&uplo, &n, h, &n, &info, 1L);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
249
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
250 chol_mat = Matrix (h, n, n);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
251
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
252 // If someone thinks of a more graceful way of doing this (or faster for
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
253 // that matter :-)), please let me know!
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
254
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
255 if (n > 1)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
256 for (int j = 0; j < a.nc; j++)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
257 for (int i = j+1; i < a.nr; i++)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
258 chol_mat.elem (i, j) = 0.0;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
259
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
260
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
261 return info;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
262 }
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
263
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
264
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
265 int
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
266 ComplexCHOL::init (const ComplexMatrix& a)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
267 {
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
268 if (a.nr != a.nc)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
269 FAIL;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
270
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
271 char uplo = 'U';
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
272
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
273 int n = a.nc;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
274 int info;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
275
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
276 Complex *h = dup (a.data, a.len);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
277
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
278 F77_FCN (zpotrf) (&uplo, &n, h, &n, &info, 1L);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
279
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
280 chol_mat = ComplexMatrix (h, n, n);
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
281
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
282 // If someone thinks of a more graceful way of doing this (or faster for
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
283 // that matter :-)), please let me know!
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
284
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
285 if (n > 1)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
286 for (int j = 0; j < a.nc; j++)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
287 for (int i = j+1; i < a.nr; i++)
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
288 chol_mat.elem (i, j) = 0.0;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
289
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
290 return info;
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
291 }
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
292
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
293
2db13bf4f3e2 [project @ 1993-10-23 22:51:34 by jwe]
jwe
parents: 22
diff changeset
294 /*
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
295 * HESS stuff
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
296 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
297
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
298 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
299 HESS::init (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
300 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
301 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
302 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
303
22
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
304 char jobbal = 'N';
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
305 char side = 'R';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
306
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
307 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
308 int lwork = 32 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
309 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
310 int ilo;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
311 int ihi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
312
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
313 double *h = dup(a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
314
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
315 double *tau = new double [n+1];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
316 double *scale = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
317 double *z = new double [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
318 double *work = new double [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
319
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
320 F77_FCN (dgebal) (&jobbal, &n, h, &n, &ilo, &ihi, scale, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
321 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
322
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
323 F77_FCN (dgehrd) (&n, &ilo, &ihi, h, &n, tau, work, &lwork, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
324 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
325
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
326 copy(z,h,n*n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
327
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
328 F77_FCN (dorghr) (&n, &ilo, &ihi, z, &n, tau, work, &lwork, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
329 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
330
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
331 F77_FCN (dgebak) (&jobbal, &side, &n, &ilo, &ihi, scale, &n, z, &n,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
332 &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
333
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
334 // We need to clear out all of the area below the sub-diagonal which was used
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
335 // to store the unitary matrix.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
336
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
337 hess_mat = Matrix(h,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
338 unitary_hess_mat = Matrix(z,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
339
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
340 // If someone thinks of a more graceful way of doing this (or faster for
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
341 // that matter :-)), please let me know!
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
342
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
343 if (n > 2)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
344 for (int j = 0; j < a.nc; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
345 for (int i = j+2; i < a.nr; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
346 hess_mat.elem(i,j) = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
347
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
348 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
349 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
350 delete [] scale;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
351
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
352 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
353 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
354
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
355
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
356 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
357 ComplexHESS::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
358 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
359 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
360 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
361
22
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
362 char job = 'N';
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
363 char side = 'R';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
364
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
365 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
366 int lwork = 32 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
367 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
368 int ilo;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
369 int ihi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
370
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
371 Complex *h = dup(a.data,a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
372
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
373 double *scale = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
374 Complex *tau = new Complex [n-1];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
375 Complex *work = new Complex [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
376 Complex *z = new Complex [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
377
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
378 F77_FCN (zgebal) (&job, &n, h, &n, &ilo, &ihi, scale, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
379
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
380 F77_FCN (zgehrd) (&n, &ilo, &ihi, h, &n, tau, work, &lwork, &info, 1L,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
381 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
382
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
383 copy(z,h,n*n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
384
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
385 F77_FCN (zunghr) (&n, &ilo, &ihi, z, &n, tau, work, &lwork, &info, 1L,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
386 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
387
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
388 F77_FCN (zgebak) (&job, &side, &n, &ilo, &ihi, scale, &n, z, &n, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
389 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
390
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
391 hess_mat = ComplexMatrix (h,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
392 unitary_hess_mat = ComplexMatrix (z,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
393
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
394 // If someone thinks of a more graceful way of doing this (or faster for
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
395 // that matter :-)), please let me know!
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
396
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
397 if (n > 2)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
398 for (int j = 0; j < a.nc; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
399 for (int i = j+2; i < a.nr; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
400 hess_mat.elem(i,j) = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
401
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
402 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
403 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
404 delete [] scale;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
405
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
406 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
407 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
408
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
409 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
410 * SCHUR stuff
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
411 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
412
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
413 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
414 select_ana (double *a, double *b)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
415 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
416 return (*a < 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
417 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
418
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
419 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
420 select_dig (double *a, double *b)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
421 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
422 return (hypot (*a, *b) < 1.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
423 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
424
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
425 // GAG.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
426 extern "C" { static int (*dummy_select)(); }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
427
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
428 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
429 SCHUR::init (const Matrix& a, const char *ord)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
430 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
431 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
432 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
433
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
434 char jobvs = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
435 char sort;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
436
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
437 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
438 sort = 'S';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
439 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
440 sort = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
441
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
442 char sense = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
443
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
444 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
445 int lwork = 8 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
446 int liwork = 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
447 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
448 int sdim;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
449 double rconde;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
450 double rcondv;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
451
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
452 double *s = dup(a.data,a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
453
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
454 double *wr = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
455 double *wi = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
456 double *q = new double [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
457 double *work = new double [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
458
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
459 // These are not referenced for the non-ordered Schur routine.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
460
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
461 int *iwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
462 int *bwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
463 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
464 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
465 iwork = new int [liwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
466 bwork = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
467 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
468
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
469 if (*ord == 'A' || *ord == 'a')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
470 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
471 F77_FCN (dgeesx) (&jobvs, &sort, select_ana, &sense, &n, s, &n,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
472 &sdim, wr, wi, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
473 &lwork, iwork, &liwork, bwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
474 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
475 else if (*ord == 'D' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
476 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
477 F77_FCN (dgeesx) (&jobvs, &sort, select_dig, &sense, &n, s, &n,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
478 &sdim, wr, wi, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
479 &lwork, iwork, &liwork, bwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
480
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
481 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
482 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
483 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
484 F77_FCN (dgeesx) (&jobvs, &sort, dummy_select, &sense, &n, s,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
485 &n, &sdim, wr, wi, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
486 work, &lwork, iwork, &liwork, bwork, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
487 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
488 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
489
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
490
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
491 schur_mat = Matrix (s, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
492 unitary_mat = Matrix (q, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
493
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
494 delete [] wr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
495 delete [] wi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
496 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
497 delete [] iwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
498 delete [] bwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
499
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
500 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
501 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
502
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
503 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
504 complex_select_ana (Complex *a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
505 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
506 return (real (*a) < 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
507 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
508
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
509 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
510 complex_select_dig (Complex *a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
511 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
512 return (abs (*a) < 1.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
513 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
514
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
515 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
516 ComplexSCHUR::init (const ComplexMatrix& a, const char *ord)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
517 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
518 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
519 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
520
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
521 char jobvs = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
522 char sort;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
523 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
524 sort = 'S';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
525 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
526 sort = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
527
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
528 char sense = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
529
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
530 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
531 int lwork = 8 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
532 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
533 int sdim;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
534 double rconde;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
535 double rcondv;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
536
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
537 double *rwork = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
538
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
539 // bwork is not referenced for non-ordered Schur.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
540
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
541 int *bwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
542 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
543 bwork = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
544
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
545 Complex *s = dup(a.data,a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
546
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
547 Complex *work = new Complex [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
548 Complex *q = new Complex [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
549 Complex *w = new Complex [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
550
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
551 if (*ord == 'A' || *ord == 'a')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
552 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
553 F77_FCN (zgeesx) (&jobvs, &sort, complex_select_ana, &sense,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
554 &n, s, &n, &sdim, w, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
555 work, &lwork, rwork, bwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
556 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
557 else if (*ord == 'D' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
558 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
559 F77_FCN (zgeesx) (&jobvs, &sort, complex_select_dig, &sense,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
560 &n, s, &n, &sdim, w, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
561 work, &lwork, rwork, bwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
562 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
563 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
564 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
565 F77_FCN (zgeesx) (&jobvs, &sort, dummy_select, &sense, &n, s,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
566 &n, &sdim, w, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
567 &lwork, rwork, bwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
568 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
569
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
570 schur_mat = ComplexMatrix (s,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
571 unitary_mat = ComplexMatrix (q,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
572
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
573 delete [] w;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
574 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
575 delete [] rwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
576 delete [] bwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
577
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
578 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
579 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
580
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
581 ostream&
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
582 operator << (ostream& os, const SCHUR& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
583 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
584 os << a.schur_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
585 os << a.unitary_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
586
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
587 return os;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
588 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
589
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
590 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
591 * SVD stuff
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
592 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
593
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
594 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
595 SVD::init (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
596 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
597 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
598
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
599 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
600 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
601
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
602 char jobu = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
603 char jobv = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
604
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
605 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
606
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
607 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
608 int max_mn = m > n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
609
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
610 double *u = new double[m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
611 double *s_vec = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
612 double *vt = new double[n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
613
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
614 int tmp1 = 3*min_mn + max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
615 int tmp2 = 5*min_mn - 4;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
616 int lwork = tmp1 > tmp2 ? tmp1 : tmp2;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
617 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
618
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
619 F77_FCN (dgesvd) (&jobu, &jobv, &m, &n, tmp_data, &m, s_vec, u, &m,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
620 vt, &n, work, &lwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
621
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
622 left_sm = Matrix (u, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
623 sigma = DiagMatrix (s_vec, m, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
624 Matrix vt_m (vt, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
625 right_sm = Matrix (vt_m.transpose ());
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
626
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
627 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
628 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
629
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
630 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
631 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
632
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
633 ostream&
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
634 operator << (ostream& os, const SVD& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
635 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
636 os << a.left_singular_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
637 os << a.singular_values () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
638 os << a.right_singular_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
639
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
640 return os;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
641 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
642
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
643 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
644 ComplexSVD::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
645 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
646 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
647
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
648 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
649 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
650
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
651 char jobu = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
652 char jobv = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
653
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
654 Complex *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
655
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
656 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
657 int max_mn = m > n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
658
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
659 Complex *u = new Complex[m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
660 double *s_vec = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
661 Complex *vt = new Complex[n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
662
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
663 int lwork = 2*min_mn + max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
664 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
665
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
666 int lrwork = 5*max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
667 double *rwork = new double[lrwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
668
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
669 F77_FCN (zgesvd) (&jobu, &jobv, &m, &n, tmp_data, &m, s_vec, u, &m,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
670 vt, &n, work, &lwork, rwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
671
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
672 left_sm = ComplexMatrix (u, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
673 sigma = DiagMatrix (s_vec, m, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
674 ComplexMatrix vt_m (vt, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
675 right_sm = ComplexMatrix (vt_m.hermitian ());
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
676
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
677 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
678 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
679
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
680 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
681 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
682
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
683 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
684 * EIG stuff.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
685 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
686
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
687 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
688 EIG::init (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
689 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
690 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
691 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
692
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
693 int n = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
694
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
695 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
696
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
697 char jobvl = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
698 char jobvr = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
699
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
700 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
701 double *wr = new double[n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
702 double *wi = new double[n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
703 Matrix vr (n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
704 double *pvr = vr.fortran_vec ();
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
705 int lwork = 8*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
706 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
707
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
708 double dummy;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
709 int idummy = 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
710
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
711 F77_FCN (dgeev) (&jobvl, &jobvr, &n, tmp_data, &n, wr, wi, &dummy,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
712 &idummy, pvr, &n, work, &lwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
713
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
714 lambda.resize (n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
715 v.resize (n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
716
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
717 for (int j = 0; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
718 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
719 if (wi[j] == 0.0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
720 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
721 lambda.elem (j) = Complex (wr[j]);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
722 for (int i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
723 v.elem (i, j) = vr.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
724 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
725 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
726 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
727 if (j+1 >= n)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
728 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
729
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
730 for (int i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
731 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
732 lambda.elem (j) = Complex (wr[j], wi[j]);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
733 lambda.elem (j+1) = Complex (wr[j+1], wi[j+1]);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
734 double real_part = vr.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
735 double imag_part = vr.elem (i, j+1);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
736 v.elem (i, j) = Complex (real_part, imag_part);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
737 v.elem (i, j+1) = Complex (real_part, -imag_part);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
738 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
739 j++;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
740 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
741 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
742
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
743 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
744 delete [] wr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
745 delete [] wi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
746 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
747
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
748 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
749 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
750
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
751 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
752 EIG::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
753 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
754
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
755 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
756 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
757
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
758 int n = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
759
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
760 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
761
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
762 char jobvl = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
763 char jobvr = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
764
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
765 lambda.resize (n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
766 v.resize (n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
767
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
768 Complex *pw = lambda.fortran_vec ();
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
769 Complex *pvr = v.fortran_vec ();
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
770
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
771 Complex *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
772
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
773 int lwork = 8*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
774 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
775 double *rwork = new double[4*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
776
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
777 Complex dummy;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
778 int idummy = 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
779
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
780 F77_FCN (zgeev) (&jobvl, &jobvr, &n, tmp_data, &n, pw, &dummy,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
781 &idummy, pvr, &n, work, &lwork, rwork, &info, 1L,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
782 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
783
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
784 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
785 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
786 delete [] rwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
787
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
788 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
789 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
790
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
791 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
792 * LU stuff.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
793 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
794
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
795 LU::LU (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
796 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
797 if (a.nr == 0 || a.nc == 0 || a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
798 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
799
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
800 int n = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
801
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
802 int *ipvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
803 int *pvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
804 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
805 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
806 int zero = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
807 double b;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
808
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
809 F77_FCN (dgesv) (&n, &zero, tmp_data, &n, ipvt, &b, &n, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
810
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
811 Matrix A_fact (tmp_data, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
812
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
813 int i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
814
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
815 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
816 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
817 ipvt[i] -= 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
818 pvt[i] = i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
819 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
820
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
821 for (i = 0; i < n - 1; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
822 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
823 int k = ipvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
824 if (k != i)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
825 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
826 int tmp = pvt[k];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
827 pvt[k] = pvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
828 pvt[i] = tmp;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
829 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
830 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
831
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
832 l.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
833 u.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
834 p.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
835
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
836 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
837 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
838 p.elem (i, pvt[i]) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
839
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
840 int j;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
841
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
842 l.elem (i, i) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
843 for (j = 0; j < i; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
844 l.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
845
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
846 for (j = i; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
847 u.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
848 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
849
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
850 delete [] ipvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
851 delete [] pvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
852 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
853
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
854 ComplexLU::ComplexLU (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
855 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
856 if (a.nr == 0 || a.nc == 0 || a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
857 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
858
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
859 int n = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
860
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
861 int *ipvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
862 int *pvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
863 Complex *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
864 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
865 int zero = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
866 Complex b;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
867
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
868 F77_FCN (zgesv) (&n, &zero, tmp_data, &n, ipvt, &b, &n, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
869
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
870 ComplexMatrix A_fact (tmp_data, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
871
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
872 int i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
873
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
874 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
875 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
876 ipvt[i] -= 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
877 pvt[i] = i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
878 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
879
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
880 for (i = 0; i < n - 1; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
881 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
882 int k = ipvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
883 if (k != i)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
884 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
885 int tmp = pvt[k];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
886 pvt[k] = pvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
887 pvt[i] = tmp;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
888 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
889 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
890
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
891 l.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
892 u.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
893 p.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
894
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
895 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
896 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
897 p.elem (i, pvt[i]) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
898
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
899 int j;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
900
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
901 l.elem (i, i) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
902 for (j = 0; j < i; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
903 l.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
904
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
905 for (j = i; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
906 u.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
907 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
908
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
909 delete [] ipvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
910 delete [] pvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
911 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
912
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
913 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
914 * QR stuff.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
915 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
916
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
917 QR::QR (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
918 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
919 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
920 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
921
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
922 if (m == 0 || n == 0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
923 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
924
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
925 double *tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
926 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
927 double *tau = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
928 int lwork = 32*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
929 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
930 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
931
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
932 if (m > n)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
933 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
934 tmp_data = new double [m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
935 copy (tmp_data, a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
936 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
937 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
938 tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
939
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
940 F77_FCN (dgeqrf) (&m, &n, tmp_data, &m, tau, work, &lwork, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
941
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
942 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
943
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
944 r.resize (m, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
945 for (int j = 0; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
946 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
947 int limit = j < min_mn-1 ? j : min_mn-1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
948 for (int i = 0; i <= limit; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
949 r.elem (i, j) = tmp_data[m*j+i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
950 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
951
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
952 lwork = 32*m;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
953 work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
954
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
955 F77_FCN (dorgqr) (&m, &m, &min_mn, tmp_data, &m, tau, work, &lwork, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
956
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
957 q = Matrix (tmp_data, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
958
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
959 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
960 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
961 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
962
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
963 ComplexQR::ComplexQR (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
964 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
965 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
966 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
967
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
968 if (m == 0 || n == 0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
969 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
970
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
971 Complex *tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
972 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
973 Complex *tau = new Complex[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
974 int lwork = 32*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
975 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
976 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
977
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
978 if (m > n)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
979 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
980 tmp_data = new Complex [m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
981 copy (tmp_data, a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
982 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
983 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
984 tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
985
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
986 F77_FCN (zgeqrf) (&m, &n, tmp_data, &m, tau, work, &lwork, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
987
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
988 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
989
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
990 r.resize (m, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
991 for (int j = 0; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
992 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
993 int limit = j < min_mn-1 ? j : min_mn-1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
994 for (int i = 0; i <= limit; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
995 r.elem (i, j) = tmp_data[m*j+i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
996 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
997
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
998 lwork = 32*m;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
999 work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1000
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1001 F77_FCN (zungqr) (&m, &m, &min_mn, tmp_data, &m, tau, work, &lwork, &info);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1002
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1003 q = ComplexMatrix (tmp_data, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1004
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1005 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1006 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1007 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1008
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1009 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1010 ;;; Local Variables: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1011 ;;; mode: C++ ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1012 ;;; page-delimiter: "^/\\*" ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1013 ;;; End: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
1014 */