Mercurial > hg > segmenter-vamp-plugin
comparison armadillo-2.4.4/include/armadillo_bits/lapack_wrapper.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:8b6102e2a9b0 |
---|---|
1 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) | |
2 // Copyright (C) 2008-2011 Conrad Sanderson | |
3 // Copyright (C) 2009 Edmund Highcock | |
4 // Copyright (C) 2011 James Sanders | |
5 // | |
6 // This file is part of the Armadillo C++ library. | |
7 // It is provided without any warranty of fitness | |
8 // for any purpose. You can redistribute this file | |
9 // and/or modify it under the terms of the GNU | |
10 // Lesser General Public License (LGPL) as published | |
11 // by the Free Software Foundation, either version 3 | |
12 // of the License or (at your option) any later version. | |
13 // (see http://www.opensource.org/licenses for more info) | |
14 | |
15 | |
16 | |
17 #ifdef ARMA_USE_LAPACK | |
18 | |
19 | |
20 //! \namespace lapack namespace for LAPACK functions | |
21 namespace lapack | |
22 { | |
23 | |
24 | |
25 template<typename eT> | |
26 inline | |
27 void | |
28 getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info) | |
29 { | |
30 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
31 | |
32 if(is_float<eT>::value == true) | |
33 { | |
34 typedef float T; | |
35 arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info); | |
36 } | |
37 else | |
38 if(is_double<eT>::value == true) | |
39 { | |
40 typedef double T; | |
41 arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info); | |
42 } | |
43 else | |
44 if(is_supported_complex_float<eT>::value == true) | |
45 { | |
46 typedef std::complex<float> T; | |
47 arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info); | |
48 } | |
49 else | |
50 if(is_supported_complex_double<eT>::value == true) | |
51 { | |
52 typedef std::complex<double> T; | |
53 arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info); | |
54 } | |
55 } | |
56 | |
57 | |
58 | |
59 template<typename eT> | |
60 inline | |
61 void | |
62 getri(blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) | |
63 { | |
64 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
65 | |
66 if(is_float<eT>::value == true) | |
67 { | |
68 typedef float T; | |
69 arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
70 } | |
71 else | |
72 if(is_double<eT>::value == true) | |
73 { | |
74 typedef double T; | |
75 arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
76 } | |
77 else | |
78 if(is_supported_complex_float<eT>::value == true) | |
79 { | |
80 typedef std::complex<float> T; | |
81 arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
82 } | |
83 else | |
84 if(is_supported_complex_double<eT>::value == true) | |
85 { | |
86 typedef std::complex<double> T; | |
87 arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
88 } | |
89 } | |
90 | |
91 | |
92 | |
93 template<typename eT> | |
94 inline | |
95 void | |
96 trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
97 { | |
98 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
99 | |
100 if(is_float<eT>::value == true) | |
101 { | |
102 typedef float T; | |
103 arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info); | |
104 } | |
105 else | |
106 if(is_double<eT>::value == true) | |
107 { | |
108 typedef double T; | |
109 arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info); | |
110 } | |
111 else | |
112 if(is_supported_complex_float<eT>::value == true) | |
113 { | |
114 typedef std::complex<float> T; | |
115 arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info); | |
116 } | |
117 else | |
118 if(is_supported_complex_double<eT>::value == true) | |
119 { | |
120 typedef std::complex<double> T; | |
121 arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info); | |
122 } | |
123 } | |
124 | |
125 | |
126 | |
127 template<typename eT> | |
128 inline | |
129 void | |
130 syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* info) | |
131 { | |
132 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
133 | |
134 if(is_float<eT>::value == true) | |
135 { | |
136 typedef float T; | |
137 arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); | |
138 } | |
139 else | |
140 if(is_double<eT>::value == true) | |
141 { | |
142 typedef double T; | |
143 arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); | |
144 } | |
145 } | |
146 | |
147 | |
148 | |
149 template<typename eT> | |
150 inline | |
151 void | |
152 heev | |
153 ( | |
154 char* jobz, char* uplo, blas_int* n, | |
155 eT* a, blas_int* lda, typename eT::value_type* w, | |
156 eT* work, blas_int* lwork, typename eT::value_type* rwork, | |
157 blas_int* info | |
158 ) | |
159 { | |
160 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
161 | |
162 if(is_supported_complex_float<eT>::value == true) | |
163 { | |
164 typedef float T; | |
165 typedef typename std::complex<T> cx_T; | |
166 arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); | |
167 } | |
168 else | |
169 if(is_supported_complex_double<eT>::value == true) | |
170 { | |
171 typedef double T; | |
172 typedef typename std::complex<T> cx_T; | |
173 arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); | |
174 } | |
175 } | |
176 | |
177 | |
178 template<typename eT> | |
179 inline | |
180 void | |
181 geev | |
182 ( | |
183 char* jobvl, char* jobvr, blas_int* n, | |
184 eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, | |
185 blas_int* ldvl, eT* vr, blas_int* ldvr, | |
186 eT* work, blas_int* lwork, | |
187 blas_int* info | |
188 ) | |
189 { | |
190 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
191 | |
192 if(is_float<eT>::value == true) | |
193 { | |
194 typedef float T; | |
195 arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); | |
196 } | |
197 else | |
198 if(is_double<eT>::value == true) | |
199 { | |
200 typedef double T; | |
201 arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); | |
202 } | |
203 } | |
204 | |
205 | |
206 template<typename eT> | |
207 inline | |
208 void | |
209 cx_geev | |
210 ( | |
211 char* jobvl, char* jobvr, blas_int* n, | |
212 eT* a, blas_int* lda, eT* w, | |
213 eT* vl, blas_int* ldvl, | |
214 eT* vr, blas_int* ldvr, | |
215 eT* work, blas_int* lwork, typename eT::value_type* rwork, | |
216 blas_int* info | |
217 ) | |
218 { | |
219 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
220 | |
221 if(is_supported_complex_float<eT>::value == true) | |
222 { | |
223 typedef float T; | |
224 typedef typename std::complex<T> cx_T; | |
225 arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); | |
226 } | |
227 else | |
228 if(is_supported_complex_double<eT>::value == true) | |
229 { | |
230 typedef double T; | |
231 typedef typename std::complex<T> cx_T; | |
232 arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); | |
233 } | |
234 } | |
235 | |
236 | |
237 | |
238 | |
239 template<typename eT> | |
240 inline | |
241 void | |
242 potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
243 { | |
244 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
245 | |
246 if(is_float<eT>::value == true) | |
247 { | |
248 typedef float T; | |
249 arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info); | |
250 } | |
251 else | |
252 if(is_double<eT>::value == true) | |
253 { | |
254 typedef double T; | |
255 arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info); | |
256 } | |
257 else | |
258 if(is_supported_complex_float<eT>::value == true) | |
259 { | |
260 typedef std::complex<float> T; | |
261 arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info); | |
262 } | |
263 else | |
264 if(is_supported_complex_double<eT>::value == true) | |
265 { | |
266 typedef std::complex<double> T; | |
267 arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info); | |
268 } | |
269 | |
270 } | |
271 | |
272 | |
273 | |
274 template<typename eT> | |
275 inline | |
276 void | |
277 potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) | |
278 { | |
279 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
280 | |
281 if(is_float<eT>::value == true) | |
282 { | |
283 typedef float T; | |
284 arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info); | |
285 } | |
286 else | |
287 if(is_double<eT>::value == true) | |
288 { | |
289 typedef double T; | |
290 arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info); | |
291 } | |
292 else | |
293 if(is_supported_complex_float<eT>::value == true) | |
294 { | |
295 typedef std::complex<float> T; | |
296 arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info); | |
297 } | |
298 else | |
299 if(is_supported_complex_double<eT>::value == true) | |
300 { | |
301 typedef std::complex<double> T; | |
302 arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info); | |
303 } | |
304 | |
305 } | |
306 | |
307 | |
308 | |
309 template<typename eT> | |
310 inline | |
311 void | |
312 geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
313 { | |
314 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
315 | |
316 if(is_float<eT>::value == true) | |
317 { | |
318 typedef float T; | |
319 arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
320 } | |
321 else | |
322 if(is_double<eT>::value == true) | |
323 { | |
324 typedef double T; | |
325 arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
326 } | |
327 else | |
328 if(is_supported_complex_float<eT>::value == true) | |
329 { | |
330 typedef std::complex<float> T; | |
331 arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
332 } | |
333 else | |
334 if(is_supported_complex_double<eT>::value == true) | |
335 { | |
336 typedef std::complex<double> T; | |
337 arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
338 } | |
339 | |
340 } | |
341 | |
342 | |
343 | |
344 template<typename eT> | |
345 inline | |
346 void | |
347 orgqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
348 { | |
349 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
350 | |
351 if(is_float<eT>::value == true) | |
352 { | |
353 typedef float T; | |
354 arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
355 } | |
356 else | |
357 if(is_double<eT>::value == true) | |
358 { | |
359 typedef double T; | |
360 arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
361 } | |
362 } | |
363 | |
364 | |
365 | |
366 template<typename eT> | |
367 inline | |
368 void | |
369 ungqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) | |
370 { | |
371 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
372 | |
373 if(is_supported_complex_float<eT>::value == true) | |
374 { | |
375 typedef float T; | |
376 arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
377 } | |
378 else | |
379 if(is_supported_complex_double<eT>::value == true) | |
380 { | |
381 typedef double T; | |
382 arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); | |
383 } | |
384 } | |
385 | |
386 | |
387 template<typename eT> | |
388 inline | |
389 void | |
390 gesvd | |
391 ( | |
392 char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda, | |
393 eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, | |
394 eT* work, blas_int* lwork, blas_int* info | |
395 ) | |
396 { | |
397 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
398 | |
399 if(is_float<eT>::value == true) | |
400 { | |
401 typedef float T; | |
402 arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); | |
403 } | |
404 else | |
405 if(is_double<eT>::value == true) | |
406 { | |
407 typedef double T; | |
408 arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); | |
409 } | |
410 } | |
411 | |
412 | |
413 | |
414 template<typename T> | |
415 inline | |
416 void | |
417 cx_gesvd | |
418 ( | |
419 char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex<T>* a, blas_int* lda, | |
420 T* s, std::complex<T>* u, blas_int* ldu, std::complex<T>* vt, blas_int* ldvt, | |
421 std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* info | |
422 ) | |
423 { | |
424 arma_type_check(( is_supported_blas_type<T>::value == false )); | |
425 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false )); | |
426 | |
427 if(is_float<T>::value == true) | |
428 { | |
429 typedef float bT; | |
430 arma_fortran(arma_cgesvd) | |
431 ( | |
432 jobu, jobvt, m, n, (std::complex<bT>*)a, lda, | |
433 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
434 (std::complex<bT>*)work, lwork, (bT*)rwork, info | |
435 ); | |
436 } | |
437 else | |
438 if(is_double<T>::value == true) | |
439 { | |
440 typedef double bT; | |
441 arma_fortran(arma_zgesvd) | |
442 ( | |
443 jobu, jobvt, m, n, (std::complex<bT>*)a, lda, | |
444 (bT*)s, (std::complex<bT>*)u, ldu, (std::complex<bT>*)vt, ldvt, | |
445 (std::complex<bT>*)work, lwork, (bT*)rwork, info | |
446 ); | |
447 } | |
448 } | |
449 | |
450 | |
451 | |
452 template<typename eT> | |
453 inline | |
454 void | |
455 gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) | |
456 { | |
457 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
458 | |
459 if(is_float<eT>::value == true) | |
460 { | |
461 typedef float T; | |
462 arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
463 } | |
464 else | |
465 if(is_double<eT>::value == true) | |
466 { | |
467 typedef double T; | |
468 arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
469 } | |
470 else | |
471 if(is_supported_complex_float<eT>::value == true) | |
472 { | |
473 typedef std::complex<float> T; | |
474 arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
475 } | |
476 else | |
477 if(is_supported_complex_double<eT>::value == true) | |
478 { | |
479 typedef std::complex<double> T; | |
480 arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); | |
481 } | |
482 } | |
483 | |
484 | |
485 | |
486 template<typename eT> | |
487 inline | |
488 void | |
489 gels(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* work, blas_int* lwork, blas_int* info) | |
490 { | |
491 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
492 | |
493 if(is_float<eT>::value == true) | |
494 { | |
495 typedef float T; | |
496 arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
497 } | |
498 else | |
499 if(is_double<eT>::value == true) | |
500 { | |
501 typedef double T; | |
502 arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
503 } | |
504 else | |
505 if(is_supported_complex_float<eT>::value == true) | |
506 { | |
507 typedef std::complex<float> T; | |
508 arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
509 } | |
510 else | |
511 if(is_supported_complex_double<eT>::value == true) | |
512 { | |
513 typedef std::complex<double> T; | |
514 arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); | |
515 } | |
516 } | |
517 | |
518 | |
519 | |
520 template<typename eT> | |
521 inline | |
522 void | |
523 trtrs(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) | |
524 { | |
525 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
526 | |
527 if(is_float<eT>::value == true) | |
528 { | |
529 typedef float T; | |
530 arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
531 } | |
532 else | |
533 if(is_double<eT>::value == true) | |
534 { | |
535 typedef double T; | |
536 arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
537 } | |
538 else | |
539 if(is_supported_complex_float<eT>::value == true) | |
540 { | |
541 typedef std::complex<float> T; | |
542 arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
543 } | |
544 else | |
545 if(is_supported_complex_double<eT>::value == true) | |
546 { | |
547 typedef std::complex<double> T; | |
548 arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); | |
549 } | |
550 } | |
551 | |
552 | |
553 | |
554 template<typename eT> | |
555 inline | |
556 void | |
557 gees(char* jobvs, char* sort, blas_int* select, blas_int* n, eT* a, blas_int* lda, blas_int* sdim, eT* wr, eT* wi, eT* vs, blas_int* ldvs, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info) | |
558 { | |
559 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
560 | |
561 if(is_float<eT>::value == true) | |
562 { | |
563 typedef float T; | |
564 arma_fortran(arma_sgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); | |
565 } | |
566 else | |
567 if(is_double<eT>::value == true) | |
568 { | |
569 typedef double T; | |
570 arma_fortran(arma_dgees)(jobvs, sort, select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); | |
571 } | |
572 } | |
573 | |
574 | |
575 | |
576 template<typename T> | |
577 inline | |
578 void | |
579 cx_gees(char* jobvs, char* sort, blas_int* select, blas_int* n, std::complex<T>* a, blas_int* lda, blas_int* sdim, std::complex<T>* w, std::complex<T>* vs, blas_int* ldvs, std::complex<T>* work, blas_int* lwork, T* rwork, blas_int* bwork, blas_int* info) | |
580 { | |
581 arma_type_check(( is_supported_blas_type<T>::value == false )); | |
582 arma_type_check(( is_supported_blas_type< std::complex<T> >::value == false )); | |
583 | |
584 if(is_float<T>::value == true) | |
585 { | |
586 typedef float bT; | |
587 typedef std::complex<bT> cT; | |
588 arma_fortran(arma_cgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); | |
589 } | |
590 else | |
591 if(is_double<T>::value == true) | |
592 { | |
593 typedef double bT; | |
594 typedef std::complex<bT> cT; | |
595 arma_fortran(arma_zgees)(jobvs, sort, select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); | |
596 } | |
597 } | |
598 | |
599 | |
600 | |
601 template<typename eT> | |
602 inline | |
603 void | |
604 trsyl(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const eT* a, blas_int* lda, const eT* b, blas_int* ldb, eT* c, blas_int* ldc, eT* scale, blas_int* info) | |
605 { | |
606 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
607 | |
608 if(is_float<eT>::value == true) | |
609 { | |
610 typedef float T; | |
611 arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); | |
612 } | |
613 else | |
614 if(is_double<eT>::value == true) | |
615 { | |
616 typedef double T; | |
617 arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); | |
618 } | |
619 else | |
620 if(is_supported_complex_float<eT>::value == true) | |
621 { | |
622 typedef std::complex<float> T; | |
623 arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info); | |
624 } | |
625 else | |
626 if(is_supported_complex_double<eT>::value == true) | |
627 { | |
628 typedef std::complex<double> T; | |
629 arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info); | |
630 } | |
631 } | |
632 | |
633 | |
634 template<typename eT> | |
635 inline | |
636 void | |
637 sytrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) | |
638 { | |
639 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
640 | |
641 if(is_float<eT>::value == true) | |
642 { | |
643 typedef float T; | |
644 arma_fortran(arma_ssytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
645 } | |
646 else | |
647 if(is_double<eT>::value == true) | |
648 { | |
649 typedef double T; | |
650 arma_fortran(arma_dsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
651 } | |
652 else | |
653 if(is_supported_complex_float<eT>::value == true) | |
654 { | |
655 typedef std::complex<float> T; | |
656 arma_fortran(arma_csytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
657 } | |
658 else | |
659 if(is_supported_complex_double<eT>::value == true) | |
660 { | |
661 typedef std::complex<double> T; | |
662 arma_fortran(arma_zsytrf)(uplo, n, (T*)a, lda, ipiv, (T*)work, lwork, info); | |
663 } | |
664 } | |
665 | |
666 | |
667 template<typename eT> | |
668 inline | |
669 void | |
670 sytri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* info) | |
671 { | |
672 arma_type_check(( is_supported_blas_type<eT>::value == false )); | |
673 | |
674 if(is_float<eT>::value == true) | |
675 { | |
676 typedef float T; | |
677 arma_fortran(arma_ssytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
678 } | |
679 else | |
680 if(is_double<eT>::value == true) | |
681 { | |
682 typedef double T; | |
683 arma_fortran(arma_dsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
684 } | |
685 else | |
686 if(is_supported_complex_float<eT>::value == true) | |
687 { | |
688 typedef std::complex<float> T; | |
689 arma_fortran(arma_csytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
690 } | |
691 else | |
692 if(is_supported_complex_double<eT>::value == true) | |
693 { | |
694 typedef std::complex<double> T; | |
695 arma_fortran(arma_zsytri)(uplo, n, (T*)a, lda, ipiv, (T*)work, info); | |
696 } | |
697 } | |
698 | |
699 | |
700 } | |
701 | |
702 | |
703 #endif |