Mercurial > octave
comparison libinterp/corefcn/schur.cc @ 21266:e69eaee28737
make better use of templates for Schur decomposition
* liboctave/numeric/schur.h, liboctave/numeric/schur.cc:
New files generated from SCHUR.h, SCHUR.cc, CmplxSCHUR.h,
CmplxSCHUR.cc, dbleSCHUR.h, dbleSCHUR.cc, fCmplxSCHUR.h,
fCmplxSCHUR.cc, floatSCHUR.h, and floatSCHUR.cc and making them
templates.
* liboctave/numeric/module.mk: Update.
* libinterp/corefcn/schur.cc, sqrtm.cc, CMatrix.cc, dMatrix.cc,
fCMatrix.cc, fMatrix.cc, mx-defs.h, mx-ext.h: Use new template classes
and header file.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 15 Feb 2016 20:06:12 -0500 |
parents | fcac5dbbf9ed |
children | 40de9f8f23a6 |
comparison
equal
deleted
inserted
replaced
21265:f780d057a3ec | 21266:e69eaee28737 |
---|---|
24 # include <config.h> | 24 # include <config.h> |
25 #endif | 25 #endif |
26 | 26 |
27 #include <string> | 27 #include <string> |
28 | 28 |
29 #include "CmplxSCHUR.h" | 29 #include "schur.h" |
30 #include "dbleSCHUR.h" | |
31 #include "fCmplxSCHUR.h" | |
32 #include "floatSCHUR.h" | |
33 | 30 |
34 #include "defun.h" | 31 #include "defun.h" |
35 #include "error.h" | 32 #include "error.h" |
36 #include "errwarn.h" | 33 #include "errwarn.h" |
37 #include "ovl.h" | 34 #include "ovl.h" |
180 { | 177 { |
181 FloatMatrix tmp = arg.float_matrix_value (); | 178 FloatMatrix tmp = arg.float_matrix_value (); |
182 | 179 |
183 if (nargout <= 1) | 180 if (nargout <= 1) |
184 { | 181 { |
185 FloatSCHUR result (tmp, ord, false); | 182 schur<FloatMatrix> result (tmp, ord, false); |
186 retval = ovl (result.schur_matrix ()); | 183 retval = ovl (result.schur_matrix ()); |
187 } | 184 } |
188 else | 185 else |
189 { | 186 { |
190 FloatSCHUR result (tmp, ord, true); | 187 schur<FloatMatrix> result (tmp, ord, true); |
191 retval = ovl (result.unitary_matrix (), | 188 retval = ovl (result.unitary_matrix (), |
192 result.schur_matrix ()); | 189 result.schur_matrix ()); |
193 } | 190 } |
194 } | 191 } |
195 else | 192 else |
196 { | 193 { |
197 FloatComplexMatrix ctmp = arg.float_complex_matrix_value (); | 194 FloatComplexMatrix ctmp = arg.float_complex_matrix_value (); |
198 | 195 |
199 if (nargout <= 1) | 196 if (nargout <= 1) |
200 { | 197 { |
201 FloatComplexSCHUR result (ctmp, ord, false); | 198 schur<FloatComplexMatrix> result (ctmp, ord, false); |
202 retval = ovl (mark_upper_triangular (result.schur_matrix ())); | 199 retval = ovl (mark_upper_triangular (result.schur_matrix ())); |
203 } | 200 } |
204 else | 201 else |
205 { | 202 { |
206 FloatComplexSCHUR result (ctmp, ord, true); | 203 schur<FloatComplexMatrix> result (ctmp, ord, true); |
207 retval = ovl (result.unitary_matrix (), | 204 retval = ovl (result.unitary_matrix (), |
208 mark_upper_triangular (result.schur_matrix ())); | 205 mark_upper_triangular (result.schur_matrix ())); |
209 } | 206 } |
210 } | 207 } |
211 } | 208 } |
215 { | 212 { |
216 Matrix tmp = arg.matrix_value (); | 213 Matrix tmp = arg.matrix_value (); |
217 | 214 |
218 if (nargout <= 1) | 215 if (nargout <= 1) |
219 { | 216 { |
220 SCHUR result (tmp, ord, false); | 217 schur<Matrix> result (tmp, ord, false); |
221 retval = ovl (result.schur_matrix ()); | 218 retval = ovl (result.schur_matrix ()); |
222 } | 219 } |
223 else | 220 else |
224 { | 221 { |
225 SCHUR result (tmp, ord, true); | 222 schur<Matrix> result (tmp, ord, true); |
226 retval = ovl (result.unitary_matrix (), | 223 retval = ovl (result.unitary_matrix (), |
227 result.schur_matrix ()); | 224 result.schur_matrix ()); |
228 } | 225 } |
229 } | 226 } |
230 else | 227 else |
231 { | 228 { |
232 ComplexMatrix ctmp = arg.complex_matrix_value (); | 229 ComplexMatrix ctmp = arg.complex_matrix_value (); |
233 | 230 |
234 if (nargout <= 1) | 231 if (nargout <= 1) |
235 { | 232 { |
236 ComplexSCHUR result (ctmp, ord, false); | 233 schur<ComplexMatrix> result (ctmp, ord, false); |
237 retval = ovl (mark_upper_triangular (result.schur_matrix ())); | 234 retval = ovl (mark_upper_triangular (result.schur_matrix ())); |
238 } | 235 } |
239 else | 236 else |
240 { | 237 { |
241 ComplexSCHUR result (ctmp, ord, true); | 238 schur<ComplexMatrix> result (ctmp, ord, true); |
242 retval = ovl (result.unitary_matrix (), | 239 retval = ovl (result.unitary_matrix (), |
243 mark_upper_triangular (result.schur_matrix ())); | 240 mark_upper_triangular (result.schur_matrix ())); |
244 } | 241 } |
245 } | 242 } |
246 } | 243 } |
302 if (args(0).is_single_type () || args(1).is_single_type ()) | 299 if (args(0).is_single_type () || args(1).is_single_type ()) |
303 { | 300 { |
304 FloatMatrix u = args(0).float_matrix_value (); | 301 FloatMatrix u = args(0).float_matrix_value (); |
305 FloatMatrix t = args(1).float_matrix_value (); | 302 FloatMatrix t = args(1).float_matrix_value (); |
306 | 303 |
307 FloatComplexSCHUR cs (FloatSCHUR (t, u)); | 304 schur<FloatComplexMatrix> cs |
305 = rsf2csf<FloatComplexMatrix, FloatMatrix> (t, u); | |
308 | 306 |
309 return ovl (cs.unitary_matrix (), cs.schur_matrix ()); | 307 return ovl (cs.unitary_matrix (), cs.schur_matrix ()); |
310 } | 308 } |
311 else | 309 else |
312 { | 310 { |
313 Matrix u = args(0).matrix_value (); | 311 Matrix u = args(0).matrix_value (); |
314 Matrix t = args(1).matrix_value (); | 312 Matrix t = args(1).matrix_value (); |
315 | 313 |
316 ComplexSCHUR cs (SCHUR (t, u)); | 314 schur<ComplexMatrix> cs = rsf2csf<ComplexMatrix, Matrix> (t, u); |
317 | 315 |
318 return ovl (cs.unitary_matrix (), cs.schur_matrix ()); | 316 return ovl (cs.unitary_matrix (), cs.schur_matrix ()); |
319 } | 317 } |
320 } | 318 } |
321 | 319 |