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