annotate liboctave/Matrix-ext.cc @ 22:2cd2476fb32d

[project @ 1993-08-10 20:28:05 by jwe] Add init functions for balancing classes.
author jwe
date Tue, 10 Aug 1993 20:28:05 +0000
parents 9a4c07481e61
children 2db13bf4f3e2
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 /*
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
232 * HESS stuff
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
233 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
234
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
235 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
236 HESS::init (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
237 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
238 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
239 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
240
22
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
241 char jobbal = 'N';
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
242 char side = 'R';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
243
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
244 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
245 int lwork = 32 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
246 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
247 int ilo;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
248 int ihi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
249
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
250 double *h = dup(a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
251
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
252 double *tau = new double [n+1];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
253 double *scale = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
254 double *z = new double [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
255 double *work = new double [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
256
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
257 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
258 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
259
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
260 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
261 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
262
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
263 copy(z,h,n*n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
264
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
265 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
266 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
267
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
268 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
269 &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
270
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
271 // 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
272 // to store the unitary matrix.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
273
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
274 hess_mat = Matrix(h,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
275 unitary_hess_mat = Matrix(z,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
276
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
277 // 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
278 // that matter :-)), please let me know!
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
279
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
280 if (n > 2)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
281 for (int j = 0; j < a.nc; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
282 for (int i = j+2; i < a.nr; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
283 hess_mat.elem(i,j) = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
284
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
285 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
286 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
287 delete [] scale;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
288
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
289 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
290 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
291
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
292
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
293 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
294 ComplexHESS::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
295 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
296 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
297 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
298
22
2cd2476fb32d [project @ 1993-08-10 20:28:05 by jwe]
jwe
parents: 3
diff changeset
299 char job = 'N';
3
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
300 char side = 'R';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
301
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
302 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
303 int lwork = 32 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
304 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
305 int ilo;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
306 int ihi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
307
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
308 Complex *h = dup(a.data,a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
309
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
310 double *scale = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
311 Complex *tau = new Complex [n-1];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
312 Complex *work = new Complex [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
313 Complex *z = new Complex [n*n];
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 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
316
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
317 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
318 1L);
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 copy(z,h,n*n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
321
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
322 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
323 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
324
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
325 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
326 1L, 1L);
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 hess_mat = ComplexMatrix (h,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
329 unitary_hess_mat = ComplexMatrix (z,n,n);
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 // 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
332 // that matter :-)), please let me know!
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 if (n > 2)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
335 for (int j = 0; j < a.nc; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
336 for (int i = j+2; i < a.nr; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
337 hess_mat.elem(i,j) = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
338
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
339 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
340 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
341 delete [] scale;
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 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
344 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
345
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
346 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
347 * SCHUR stuff
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
348 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
349
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
350 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
351 select_ana (double *a, double *b)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
352 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
353 return (*a < 0.0);
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 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
357 select_dig (double *a, double *b)
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 return (hypot (*a, *b) < 1.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
360 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
361
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
362 // GAG.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
363 extern "C" { static int (*dummy_select)(); }
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
366 SCHUR::init (const Matrix& a, const char *ord)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
367 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
368 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
369 FAIL;
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 char jobvs = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
372 char sort;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
373
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
374 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
375 sort = 'S';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
376 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
377 sort = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
378
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
379 char sense = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
380
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
381 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
382 int lwork = 8 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
383 int liwork = 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
384 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
385 int sdim;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
386 double rconde;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
387 double rcondv;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
388
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
389 double *s = dup(a.data,a.len);
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 double *wr = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
392 double *wi = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
393 double *q = new double [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
394 double *work = new double [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
395
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
396 // These are not referenced for the non-ordered Schur routine.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
397
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
398 int *iwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
399 int *bwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
400 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
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 iwork = new int [liwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
403 bwork = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
404 }
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 if (*ord == 'A' || *ord == 'a')
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 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
409 &sdim, wr, wi, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
410 &lwork, iwork, &liwork, bwork, &info, 1L, 1L);
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 else if (*ord == 'D' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
413 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
414 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
415 &sdim, wr, wi, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
416 &lwork, iwork, &liwork, bwork, &info, 1L, 1L);
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 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
420 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
421 F77_FCN (dgeesx) (&jobvs, &sort, dummy_select, &sense, &n, s,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
422 &n, &sdim, wr, wi, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
423 work, &lwork, iwork, &liwork, bwork, &info,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
424 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
425 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
426
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 schur_mat = Matrix (s, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
429 unitary_mat = Matrix (q, n, n);
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 delete [] wr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
432 delete [] wi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
433 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
434 delete [] iwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
435 delete [] bwork;
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 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
438 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
439
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
440 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
441 complex_select_ana (Complex *a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
442 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
443 return (real (*a) < 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
444 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
445
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
446 static int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
447 complex_select_dig (Complex *a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
448 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
449 return (abs (*a) < 1.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
450 }
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 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
453 ComplexSCHUR::init (const ComplexMatrix& a, const char *ord)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
454 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
455 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
456 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
457
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
458 char jobvs = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
459 char sort;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
460 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
461 sort = 'S';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
462 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
463 sort = 'N';
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 char sense = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
466
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
467 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
468 int lwork = 8 * n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
469 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
470 int sdim;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
471 double rconde;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
472 double rcondv;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
473
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
474 double *rwork = new double [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
475
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
476 // bwork is not referenced for non-ordered Schur.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
477
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
478 int *bwork = (int *) NULL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
479 if (*ord == 'A' || *ord == 'D' || *ord == 'a' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
480 bwork = new int [n];
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 Complex *s = dup(a.data,a.len);
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 Complex *work = new Complex [lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
485 Complex *q = new Complex [n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
486 Complex *w = new Complex [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
487
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
488 if (*ord == 'A' || *ord == 'a')
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 F77_FCN (zgeesx) (&jobvs, &sort, complex_select_ana, &sense,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
491 &n, s, &n, &sdim, w, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
492 work, &lwork, rwork, bwork, &info, 1L, 1L);
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 else if (*ord == 'D' || *ord == 'd')
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
495 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
496 F77_FCN (zgeesx) (&jobvs, &sort, complex_select_dig, &sense,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
497 &n, s, &n, &sdim, w, q, &n, &rconde, &rcondv,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
498 work, &lwork, rwork, bwork, &info, 1L, 1L);
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 else
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 F77_FCN (zgeesx) (&jobvs, &sort, dummy_select, &sense, &n, s,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
503 &n, &sdim, w, q, &n, &rconde, &rcondv, work,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
504 &lwork, rwork, bwork, &info, 1L, 1L);
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
507 schur_mat = ComplexMatrix (s,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
508 unitary_mat = ComplexMatrix (q,n,n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
509
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
510 delete [] w;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
511 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
512 delete [] rwork;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
513 delete [] bwork;
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 return info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
516 }
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 ostream&
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
519 operator << (ostream& os, const SCHUR& a)
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 os << a.schur_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
522 os << a.unitary_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
523
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
524 return os;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
525 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
526
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 * SVD stuff
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
531 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
532 SVD::init (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
533 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
534 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
535
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
536 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
537 int n = a.nc;
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 char jobu = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
540 char jobv = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
541
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
542 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
543
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
544 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
545 int max_mn = m > n ? m : n;
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 double *u = new double[m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
548 double *s_vec = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
549 double *vt = new double[n*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 int tmp1 = 3*min_mn + max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
552 int tmp2 = 5*min_mn - 4;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
553 int lwork = tmp1 > tmp2 ? tmp1 : tmp2;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
554 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
555
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
556 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
557 vt, &n, work, &lwork, &info, 1L, 1L);
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 left_sm = Matrix (u, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
560 sigma = DiagMatrix (s_vec, m, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
561 Matrix vt_m (vt, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
562 right_sm = Matrix (vt_m.transpose ());
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
563
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
564 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
565 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
566
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
567 return info;
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 ostream&
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
571 operator << (ostream& os, const SVD& a)
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 os << a.left_singular_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
574 os << a.singular_values () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
575 os << a.right_singular_matrix () << "\n";
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
576
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
577 return os;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
578 }
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 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
581 ComplexSVD::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
582 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
583 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
584
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
585 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
586 int n = a.nc;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
587
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
588 char jobu = 'A';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
589 char jobv = 'A';
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 Complex *tmp_data = dup (a.data, a.len);
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 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
594 int max_mn = m > n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
595
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
596 Complex *u = new Complex[m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
597 double *s_vec = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
598 Complex *vt = new Complex[n*n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
599
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
600 int lwork = 2*min_mn + max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
601 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
602
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
603 int lrwork = 5*max_mn;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
604 double *rwork = new double[lrwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
605
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
606 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
607 vt, &n, work, &lwork, rwork, &info, 1L, 1L);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
608
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
609 left_sm = ComplexMatrix (u, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
610 sigma = DiagMatrix (s_vec, m, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
611 ComplexMatrix vt_m (vt, n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
612 right_sm = ComplexMatrix (vt_m.hermitian ());
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 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
615 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
616
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
617 return info;
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
620 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
621 * EIG stuff.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
622 */
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
623
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
624 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
625 EIG::init (const Matrix& a)
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 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
628 FAIL;
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 int n = a.nr;
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 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
633
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
634 char jobvl = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
635 char jobvr = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
636
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
637 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
638 double *wr = new double[n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
639 double *wi = new double[n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
640 Matrix vr (n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
641 double *pvr = vr.fortran_vec ();
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
642 int lwork = 8*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
643 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
644
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
645 double dummy;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
646 int idummy = 1;
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 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
649 &idummy, pvr, &n, work, &lwork, &info, 1L, 1L);
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 lambda.resize (n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
652 v.resize (n, n);
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 for (int j = 0; j < n; j++)
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 if (wi[j] == 0.0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
657 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
658 lambda.elem (j) = Complex (wr[j]);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
659 for (int i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
660 v.elem (i, j) = vr.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
661 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
662 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
663 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
664 if (j+1 >= n)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
665 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
666
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
667 for (int i = 0; i < n; i++)
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 lambda.elem (j) = Complex (wr[j], wi[j]);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
670 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
671 double real_part = vr.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
672 double imag_part = vr.elem (i, j+1);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
673 v.elem (i, j) = Complex (real_part, imag_part);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
674 v.elem (i, j+1) = Complex (real_part, -imag_part);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
675 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
676 j++;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
677 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
678 }
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 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
681 delete [] wr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
682 delete [] wi;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
683 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
684
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
685 return info;
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
688 int
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
689 EIG::init (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
690 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
691
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
692 if (a.nr != a.nc)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
693 FAIL;
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 n = a.nr;
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 int info;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
698
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
699 char jobvl = 'N';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
700 char jobvr = 'V';
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
701
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
702 lambda.resize (n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
703 v.resize (n, n);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
704
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
705 Complex *pw = lambda.fortran_vec ();
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
706 Complex *pvr = v.fortran_vec ();
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 Complex *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
709
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
710 int lwork = 8*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
711 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
712 double *rwork = new double[4*n];
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 Complex dummy;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
715 int idummy = 1;
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 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
718 &idummy, pvr, &n, work, &lwork, rwork, &info, 1L,
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
719 1L);
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 delete [] tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
722 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
723 delete [] rwork;
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 return info;
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
728 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
729 * LU stuff.
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
730 */
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 LU::LU (const Matrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
733 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
734 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
735 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
736
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
737 int n = a.nr;
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 int *ipvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
740 int *pvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
741 double *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
742 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
743 int zero = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
744 double b;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
745
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
746 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
747
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
748 Matrix A_fact (tmp_data, n, n);
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 int i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
751
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
752 for (i = 0; i < n; i++)
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 ipvt[i] -= 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
755 pvt[i] = i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
756 }
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 for (i = 0; i < n - 1; i++)
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 k = ipvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
761 if (k != i)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
762 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
763 int tmp = pvt[k];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
764 pvt[k] = pvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
765 pvt[i] = tmp;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
766 }
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
769 l.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
770 u.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
771 p.resize (n, n, 0.0);
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 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
774 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
775 p.elem (i, pvt[i]) = 1.0;
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 int j;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
778
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
779 l.elem (i, i) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
780 for (j = 0; j < i; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
781 l.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
782
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
783 for (j = i; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
784 u.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
785 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
786
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
787 delete [] ipvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
788 delete [] pvt;
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 ComplexLU::ComplexLU (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
792 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
793 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
794 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
795
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
796 int n = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
797
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
798 int *ipvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
799 int *pvt = new int [n];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
800 Complex *tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
801 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
802 int zero = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
803 Complex b;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
804
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
805 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
806
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
807 ComplexMatrix A_fact (tmp_data, n, n);
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 int i;
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 for (i = 0; i < n; i++)
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 ipvt[i] -= 1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
814 pvt[i] = i;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
815 }
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 for (i = 0; i < n - 1; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
818 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
819 int k = ipvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
820 if (k != i)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
821 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
822 int tmp = pvt[k];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
823 pvt[k] = pvt[i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
824 pvt[i] = tmp;
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 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
827
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
828 l.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
829 u.resize (n, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
830 p.resize (n, n, 0.0);
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 for (i = 0; i < n; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
833 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
834 p.elem (i, pvt[i]) = 1.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 int j;
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 l.elem (i, i) = 1.0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
839 for (j = 0; j < i; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
840 l.elem (i, j) = A_fact.elem (i, 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 for (j = i; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
843 u.elem (i, j) = A_fact.elem (i, j);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
844 }
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 delete [] ipvt;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
847 delete [] pvt;
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 /*
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
851 * QR stuff.
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 QR::QR (const Matrix& 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 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
857 int n = a.nc;
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 if (m == 0 || n == 0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
860 FAIL;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
861
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
862 double *tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
863 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
864 double *tau = new double[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
865 int lwork = 32*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
866 double *work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
867 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
868
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
869 if (m > n)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
870 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
871 tmp_data = new double [m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
872 copy (tmp_data, a.data, a.len);
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 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
875 tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
876
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
877 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
878
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
879 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
880
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
881 r.resize (m, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
882 for (int j = 0; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
883 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
884 int limit = j < min_mn-1 ? j : min_mn-1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
885 for (int i = 0; i <= limit; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
886 r.elem (i, j) = tmp_data[m*j+i];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
887 }
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 lwork = 32*m;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
890 work = new double[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
891
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
892 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
893
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
894 q = Matrix (tmp_data, m, m);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
895
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
896 delete [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
897 delete [] work;
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
900 ComplexQR::ComplexQR (const ComplexMatrix& a)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
901 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
902 int m = a.nr;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
903 int n = a.nc;
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 if (m == 0 || n == 0)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
906 FAIL;
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 Complex *tmp_data;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
909 int min_mn = m < n ? m : n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
910 Complex *tau = new Complex[min_mn];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
911 int lwork = 32*n;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
912 Complex *work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
913 int info = 0;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
914
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
915 if (m > n)
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 tmp_data = new Complex [m*m];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
918 copy (tmp_data, a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
919 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
920 else
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
921 tmp_data = dup (a.data, a.len);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
922
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
923 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
924
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
925 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
926
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
927 r.resize (m, n, 0.0);
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
928 for (int j = 0; j < n; j++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
929 {
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
930 int limit = j < min_mn-1 ? j : min_mn-1;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
931 for (int i = 0; i <= limit; i++)
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
932 r.elem (i, j) = tmp_data[m*j+i];
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
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
935 lwork = 32*m;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
936 work = new Complex[lwork];
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
937
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
938 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
939
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
940 q = ComplexMatrix (tmp_data, m, m);
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 [] tau;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
943 delete [] work;
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
944 }
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
945
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 ;;; Local Variables: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
948 ;;; mode: C++ ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
949 ;;; page-delimiter: "^/\\*" ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
950 ;;; End: ***
9a4c07481e61 [project @ 1993-08-08 01:20:23 by jwe]
jwe
parents:
diff changeset
951 */