Mercurial > hg > octave-nkf
comparison liboctave/CmplxQRP.cc @ 1922:8a57554f3142
[project @ 1996-02-11 02:53:20 by jwe]
author | jwe |
---|---|
date | Sun, 11 Feb 1996 02:53:20 +0000 |
parents | 1281a23a34dd |
children | 20353fa5f83d |
comparison
equal
deleted
inserted
replaced
1921:ce0db0ca0729 | 1922:8a57554f3142 |
---|---|
51 | 51 |
52 ComplexQRP::ComplexQRP (const ComplexMatrix& a, QR::type qr_type) | 52 ComplexQRP::ComplexQRP (const ComplexMatrix& a, QR::type qr_type) |
53 { | 53 { |
54 assert (qr_type != QR::raw); | 54 assert (qr_type != QR::raw); |
55 | 55 |
56 tau = 0; | |
57 work = 0; | |
58 tmp_data = 0; | |
59 jpvt = 0; | |
60 | |
56 int m = a.rows (); | 61 int m = a.rows (); |
57 int n = a.cols (); | 62 int n = a.cols (); |
58 | 63 |
59 if (m == 0 || n == 0) | 64 if (m == 0 || n == 0) |
60 { | 65 { |
61 (*current_liboctave_error_handler) | 66 (*current_liboctave_error_handler) |
62 ("ComplexQR must have non-empty matrix"); | 67 ("ComplexQR must have non-empty matrix"); |
63 return; | 68 return; |
64 } | 69 } |
65 | 70 |
66 Complex *tmp_data; | |
67 int min_mn = m < n ? m : n; | 71 int min_mn = m < n ? m : n; |
68 Complex *tau = new Complex[min_mn]; | 72 tau = new Complex[min_mn]; |
73 | |
69 int lwork = n; | 74 int lwork = n; |
70 Complex *work = new Complex[lwork]; | 75 work = new Complex[lwork]; |
76 | |
71 int info = 0; | 77 int info = 0; |
72 | 78 |
73 if (m > n) | 79 if (m > n) |
74 { | 80 { |
75 tmp_data = new Complex [m*m]; | 81 tmp_data = new Complex [m*m]; |
76 copy (tmp_data, a.data (), a.length ()); | 82 copy (tmp_data, a.data (), a.length ()); |
77 } | 83 } |
78 else | 84 else |
79 tmp_data = dup (a.data (), a.length ()); | 85 tmp_data = dup (a.data (), a.length ()); |
80 | 86 |
81 | |
82 work = new Complex[n]; | 87 work = new Complex[n]; |
83 double *rwork = new double[2*n]; | 88 rwork = new double[2*n]; |
84 int *jpvt = new int[n]; | 89 jpvt = new int[n]; |
85 | 90 |
86 // Clear Pivot vector (code to enforce a certain permutation would | 91 // Clear Pivot vector (code to enforce a certain permutation would |
87 // go here...) | 92 // go here...) |
88 | 93 |
89 for (int i = 0; i < n; i++) | 94 for (int i = 0; i < n; i++) |
90 jpvt[i] = 0; | 95 jpvt[i] = 0; |
91 | 96 |
92 F77_FCN (zgeqpf, ZGEQPF) (m, n, tmp_data, m, jpvt, tau, work, rwork, | 97 F77_XFCN (zgeqpf, ZGEQPF, (m, n, tmp_data, m, jpvt, tau, work, rwork, |
93 info); | 98 info)); |
94 | 99 |
95 // Form Permutation matrix (if economy is requested, return the | 100 delete [] work; |
96 // indices only!) | 101 work = 0; |
97 | 102 |
98 if (qr_type == QR::economy && m > n) | 103 delete [] rwork; |
99 { | 104 rwork = 0; |
100 p.resize (1, n, 0.0); | 105 |
101 for (int j = 0; j < n; j++) | 106 if (f77_exception_encountered) |
102 p.elem (0, j) = jpvt[j]; | 107 (*current_liboctave_error_handler) ("unrecoverable error in zgeqpf"); |
103 } | |
104 else | 108 else |
105 { | 109 { |
106 p.resize (n, n, 0.0); | 110 // Form Permutation matrix (if economy is requested, return the |
111 // indices only!) | |
112 | |
113 if (qr_type == QR::economy && m > n) | |
114 { | |
115 p.resize (1, n, 0.0); | |
116 for (int j = 0; j < n; j++) | |
117 p.elem (0, j) = jpvt[j]; | |
118 } | |
119 else | |
120 { | |
121 p.resize (n, n, 0.0); | |
122 for (int j = 0; j < n; j++) | |
123 p.elem (jpvt[j]-1, j) = 1.0; | |
124 } | |
125 | |
126 delete [] jpvt; | |
127 jpvt = 0; | |
128 | |
129 volatile int n2; | |
130 | |
131 if (qr_type == QR::economy && m > n) | |
132 { | |
133 n2 = n; | |
134 r.resize (n, n, 0.0); | |
135 } | |
136 else | |
137 { | |
138 n2 = m; | |
139 r.resize (m, n, 0.0); | |
140 } | |
141 | |
107 for (int j = 0; j < n; j++) | 142 for (int j = 0; j < n; j++) |
108 p.elem (jpvt[j]-1, j) = 1.0; | 143 { |
144 int limit = j < min_mn-1 ? j : min_mn-1; | |
145 for (int i = 0; i <= limit; i++) | |
146 r.elem (i, j) = tmp_data[m*j+i]; | |
147 } | |
148 | |
149 lwork = 32*m; | |
150 work = new Complex[lwork]; | |
151 | |
152 F77_XFCN (zungqr, ZUNGQR, (m, m, min_mn, tmp_data, m, tau, work, | |
153 lwork, info)); | |
154 | |
155 if (f77_exception_encountered) | |
156 (*current_liboctave_error_handler) ("unrecoverable error in zungqr"); | |
157 else | |
158 { | |
159 q = ComplexMatrix (tmp_data, m, m); | |
160 tmp_data = 0; | |
161 q.resize (m, n2); | |
162 } | |
109 } | 163 } |
110 | 164 |
165 delete [] tau; | |
166 tau = 0; | |
167 | |
168 delete [] work; | |
169 work = 0; | |
170 | |
171 delete [] tmp_data; | |
172 tmp_data = 0; | |
173 | |
111 delete [] jpvt; | 174 delete [] jpvt; |
112 delete [] work; | 175 jpvt = 0; |
113 | |
114 int n2; | |
115 if (qr_type == QR::economy && m > n) | |
116 { | |
117 n2 = n; | |
118 r.resize (n, n, 0.0); | |
119 } | |
120 else | |
121 { | |
122 n2 = m; | |
123 r.resize (m, n, 0.0); | |
124 } | |
125 | |
126 for (int j = 0; j < n; j++) | |
127 { | |
128 int limit = j < min_mn-1 ? j : min_mn-1; | |
129 for (int i = 0; i <= limit; i++) | |
130 r.elem (i, j) = tmp_data[m*j+i]; | |
131 } | |
132 | |
133 lwork = 32*m; | |
134 work = new Complex[lwork]; | |
135 | |
136 F77_FCN (zungqr, ZUNGQR) (m, m, min_mn, tmp_data, m, tau, work, | |
137 lwork, info); | |
138 | |
139 q = ComplexMatrix (tmp_data, m, m); | |
140 q.resize (m, n2); | |
141 | |
142 delete [] tau; | |
143 delete [] work; | |
144 } | 176 } |
145 | 177 |
146 /* | 178 /* |
147 ;;; Local Variables: *** | 179 ;;; Local Variables: *** |
148 ;;; mode: C++ *** | 180 ;;; mode: C++ *** |