33 #ifndef __INCLUDE_NUMERIC__
34 #define __INCLUDE_NUMERIC__
37 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
42 #ifndef __INCLUDE_MIST_MATRIX__
90 struct numerical_exception
95 numerical_exception( ) : error( 0 ), message( )
99 numerical_exception(
int err,
const std::string &msg =
"" ) : error( err ), message( msg )
103 numerical_exception(
const std::string &msg ) : error( 0 ), message( msg )
107 numerical_exception(
const numerical_exception &e ) : error( e.error ), message( e.message )
113 namespace __clapack__
117 #if defined(_USE_INTEL_MATH_KERNEL_LIBRARY_) && _USE_INTEL_MATH_KERNEL_LIBRARY_ != 0
118 #define LPFNAME( name ) name // LAPACK用
119 #define BLFNAME( name ) name // BLAS用
121 #define LPFNAME( name ) name ## _ // LAPACK用
122 #define BLFNAME( name ) f2c_ ## name // BLAS用
128 typedef long int integer;
130 typedef double doublereal;
131 struct complex { real r, i; };
132 struct doublecomplex { doublereal r, i; };
137 int BLFNAME( sgemm ) (
char *transa,
char *transb, integer *m, integer *n, integer *k, real *alpha, real *a, integer *lda, real *b, integer *ldb, real *beta, real *c__, integer *ldc );
138 int BLFNAME( dgemm ) (
char *transa,
char *transb, integer *m, integer *n, integer *k, doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, integer *ldc );
139 int BLFNAME( cgemm ) (
char *transa,
char *transb, integer *m, integer *n, integer *k, complex *alpha, complex *a, integer *lda, complex *b, integer *ldb, complex *beta, complex *c__, integer *ldc );
140 int BLFNAME( zgemm ) (
char *transa,
char *transb, integer *m, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex *c__, integer *ldc );
143 int BLFNAME( sgemv ) (
char *trans, integer *m, integer *n, real *alpha, real *a, integer *lda, real *x, integer *incx, real *beta, real *y, integer *incy );
144 int BLFNAME( dgemv ) (
char *trans, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy );
145 int BLFNAME( cgemv ) (
char *trans, integer *m, integer *n, complex *alpha, complex *a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, integer *incy );
146 int BLFNAME( zgemv ) (
char *trans, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy );
149 int LPFNAME( sgesv ) ( integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info );
150 int LPFNAME( dgesv ) ( integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info );
151 int LPFNAME( cgesv ) ( integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer *info );
152 int LPFNAME( zgesv ) ( integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer *info );
154 int LPFNAME( sgbsv ) ( integer *n, integer *kl, integer *ku, integer *nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, integer *info );
155 int LPFNAME( dgbsv ) ( integer *n, integer *kl, integer *ku, integer *nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, integer *ldb, integer *info );
156 int LPFNAME( cgbsv ) ( integer *n, integer *kl, integer *ku, integer *nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer *ldb, integer *info );
157 int LPFNAME( zgbsv ) ( integer *n, integer *kl, integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex *b, integer *ldb, integer *info );
159 int LPFNAME( sgtsv ) ( integer *n, integer *nrhs, real *dl, real *d__, real *du, real *b, integer *ldb, integer *info );
160 int LPFNAME( dgtsv ) ( integer *n, integer *nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *b, integer *ldb, integer *info );
161 int LPFNAME( cgtsv ) ( integer *n, integer *nrhs, complex *dl, complex *d__, complex *du, complex *b, integer *ldb, integer *info );
162 int LPFNAME( zgtsv ) ( integer *n, integer *nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *b, integer *ldb, integer *info );
164 int LPFNAME( ssysv ) (
char *uplo, integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, real *work, integer *lwork, integer *info );
165 int LPFNAME( dsysv ) (
char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info );
166 int LPFNAME( csysv ) (
char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info );
167 int LPFNAME( zsysv ) (
char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info );
169 int LPFNAME( chesv ) (
char *uplo, integer *n, integer *nrhs, complex *a, integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, integer *lwork, integer *info );
170 int LPFNAME( zhesv ) (
char *uplo, integer *n, integer *nrhs, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *work, integer *lwork, integer *info );
172 int LPFNAME( spbsv ) (
char *uplo, integer *n, integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info );
173 int LPFNAME( dpbsv ) (
char *uplo, integer *n, integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, integer *info );
174 int LPFNAME( cpbsv ) (
char *uplo, integer *n, integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer *info );
175 int LPFNAME( zpbsv ) (
char *uplo, integer *n, integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer *ldb, integer *info );
178 int LPFNAME( sgetrf ) ( integer *m, integer *n, real *a, integer *lda, integer *ipiv, integer *info );
179 int LPFNAME( dgetrf ) ( integer *m, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info );
180 int LPFNAME( cgetrf ) ( integer *m, integer *n, complex *a, integer *lda, integer *ipiv, integer *info );
181 int LPFNAME( zgetrf ) ( integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info );
183 int LPFNAME( sgbtrf ) ( integer *m, integer *n, integer *kl, integer *ku, real *ab, integer *ldab, integer *ipiv, integer *info );
184 int LPFNAME( dgbtrf ) ( integer *m, integer *n, integer *kl, integer *ku, doublereal *ab, integer *ldab, integer *ipiv, integer *info );
185 int LPFNAME( cgbtrf ) ( integer *m, integer *n, integer *kl, integer *ku, complex *ab, integer *ldab, integer *ipiv, integer *info );
186 int LPFNAME( zgbtrf ) ( integer *m, integer *n, integer *kl, integer *ku, doublecomplex *ab, integer *ldab, integer *ipiv, integer *info );
188 int LPFNAME( sgttrf ) ( integer *n, real *dl, real *d__, real *du, real *du2, integer *ipiv, integer *info );
189 int LPFNAME( dgttrf ) ( integer *n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, integer *info );
190 int LPFNAME( cgttrf ) ( integer *n, complex *dl, complex *d__, complex *du, complex *du2, integer *ipiv, integer *info );
191 int LPFNAME( zgttrf ) ( integer *n, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, integer *info );
193 int LPFNAME( ssytrf ) (
char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info );
194 int LPFNAME( dsytrf ) (
char *uplo, integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info );
195 int LPFNAME( csytrf ) (
char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info );
196 int LPFNAME( zsytrf ) (
char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info );
198 int LPFNAME( chetrf ) (
char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info );
199 int LPFNAME( zhetrf ) (
char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info );
202 int LPFNAME( spotrf ) (
char *uplo, integer *n, real *a, integer *lda, integer *info );
203 int LPFNAME( dpotrf ) (
char *uplo, integer *n, doublereal *a, integer *lda, integer *info );
204 int LPFNAME( cpotrf ) (
char *uplo, integer *n, complex *a, integer *lda, integer *info );
205 int LPFNAME( zpotrf ) (
char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info );
208 int LPFNAME( sgeqrf ) ( integer *m, integer *n, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info );
209 int LPFNAME( dgeqrf ) ( integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info );
210 int LPFNAME( cgeqrf ) ( integer *m, integer *n, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info );
211 int LPFNAME( zgeqrf ) ( integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info );
213 int LPFNAME( sgeqp3 ) ( integer *m, integer *n, real *a, integer *lda, integer *jpvt, real *tau, real *work, integer *lwork, integer *info );
214 int LPFNAME( dgeqp3 ) ( integer *m, integer *n, doublereal *a, integer *lda, integer *jpvt, doublereal *tau, doublereal *work, integer *lwork, integer *info );
215 int LPFNAME( cgeqp3 ) ( integer *m, integer *n, complex *a, integer *lda, integer *jpvt, complex *tau, complex *work, integer *lwork, real *rwork, integer *info );
216 int LPFNAME( zgeqp3 ) ( integer *m, integer *n, doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info );
218 int LPFNAME( sorgqr ) ( integer *m, integer *n, integer *k, real *a, integer *lda, real *tau, real *work, integer *lwork, integer *info );
219 int LPFNAME( dorgqr ) ( integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info );
220 int LPFNAME( cungqr ) ( integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info );
221 int LPFNAME( zungqr ) ( integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info );
224 int LPFNAME( sgetri ) ( integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *lwork, integer *info );
225 int LPFNAME( dgetri ) ( integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *lwork, integer *info );
226 int LPFNAME( cgetri ) ( integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *lwork, integer *info );
227 int LPFNAME( zgetri ) ( integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, integer *info );
229 int LPFNAME( ssytri ) (
char *uplo, integer *n, real *a, integer *lda, integer *ipiv, real *work, integer *info );
230 int LPFNAME( dsytri ) (
char *uplo, integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, integer *info );
231 int LPFNAME( csytri ) (
char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info );
232 int LPFNAME( zsytri ) (
char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info );
234 int LPFNAME( chetri ) (
char *uplo, integer *n, complex *a, integer *lda, integer *ipiv, complex *work, integer *info );
235 int LPFNAME( zhetri ) (
char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, integer *info );
239 int LPFNAME( sgeev ) (
char *jobvl,
char *jobvr, integer *n, real *a, integer *lda, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, integer *lwork, integer *info );
240 int LPFNAME( dgeev ) (
char *jobvl,
char *jobvr, integer *n, doublereal *a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, integer *info );
241 int LPFNAME( cgeev ) (
char *jobvl,
char *jobvr, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex *work, integer *lwork, real *rwork, integer *info );
242 int LPFNAME( zgeev ) (
char *jobvl,
char *jobvr, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info );
244 int LPFNAME( ssyev ) (
char *jobz,
char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *info );
245 int LPFNAME( dsyev ) (
char *jobz,
char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *info );
247 int LPFNAME( ssbev ) (
char *jobz,
char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *info );
248 int LPFNAME( dsbev ) (
char *jobz,
char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *info );
250 int LPFNAME( sstev ) (
char *jobz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *info );
251 int LPFNAME( dstev ) (
char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *info );
253 int LPFNAME( cheev ) (
char *jobz,
char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *info );
254 int LPFNAME( zheev ) (
char *jobz,
char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info );
256 int LPFNAME( chbev ) (
char *jobz,
char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *info );
257 int LPFNAME( zhbev ) (
char *jobz,
char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *info );
261 int LPFNAME( sgeevx ) (
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer *n, real *a, integer *lda, real *wr, real *wi, real *vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer *ihi, real *scale, real *abnrm, real *rconde, real *rcondv, real *work, integer *lwork, integer *iwork, integer *info );
262 int LPFNAME( dgeevx ) (
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer *n, doublereal *a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublereal *work, integer *lwork, integer *iwork, integer *info );
263 int LPFNAME( cgeevx ) (
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer *n, complex *a, integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *ilo, integer *ihi, real *scale, real *abnrm, real *rconde, real *rcondv, complex *work, integer *lwork, real *rwork, integer *info );
264 int LPFNAME( zgeevx ) (
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info );
266 int LPFNAME( ssyevx ) (
char *jobz,
char *range,
char *uplo, integer *n, real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *ifail, integer *info );
267 int LPFNAME( dsyevx ) (
char *jobz,
char *range,
char *uplo, integer *n, doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *ifail, integer *info );
269 int LPFNAME( ssbevx ) (
char *jobz,
char *range,
char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info );
270 int LPFNAME( dsbevx ) (
char *jobz,
char *range,
char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info );
272 int LPFNAME( sstevx ) (
char *jobz,
char *range, integer *n, real *d__, real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real *work, integer *iwork, integer *ifail, integer *info );
273 int LPFNAME( dstevx ) (
char *jobz,
char *range, integer *n, doublereal *d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *iwork, integer *ifail, integer *info );
275 int LPFNAME( cheevx ) (
char *jobz,
char *range,
char *uplo, integer *n, complex *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *iwork, integer *ifail, integer *info );
276 int LPFNAME( zheevx ) (
char *jobz,
char *range,
char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *ifail, integer *info );
278 int LPFNAME( chbevx ) (
char *jobz,
char *range,
char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, complex *q, integer *ldq, real *vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer *info );
279 int LPFNAME( zhbevx ) (
char *jobz,
char *range,
char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *q, integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, integer *ifail, integer *info );
284 int LPFNAME( sgesvd ) (
char *jobu,
char *jobvt, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *info );
285 int LPFNAME( dgesvd ) (
char *jobu,
char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *info );
286 int LPFNAME( cgesvd ) (
char *jobu,
char *jobvt, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex *vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *info );
287 int LPFNAME( zgesvd ) (
char *jobu,
char *jobvt, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *info );
291 int LPFNAME( sgesdd ) (
char *jobz, integer *m, integer *n, real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, real *work, integer *lwork, integer *iwork, integer *info );
292 int LPFNAME( dgesdd ) (
char *jobz, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, integer *iwork, integer *info );
293 int LPFNAME( cgesdd ) (
char *jobz, integer *m, integer *n, complex *a, integer *lda, real *s, complex *u, integer *ldu, complex *vt, integer *ldvt, complex *work, integer *lwork, real *rwork, integer *iwork, integer *info );
294 int LPFNAME( zgesdd ) (
char *jobz, integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, integer *lwork, doublereal *rwork, integer *iwork, integer *info );
299 int LPFNAME( ssyevd ) (
char *jobz,
char *uplo, integer *n, real *a, integer *lda, real *w, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
300 int LPFNAME( dsyevd ) (
char *jobz,
char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
302 int LPFNAME( ssbevd ) (
char *jobz,
char *uplo, integer *n, integer *kd, real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
303 int LPFNAME( dsbevd ) (
char *jobz,
char *uplo, integer *n, integer *kd, doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
305 int LPFNAME( sstevd ) (
char *jobz, integer *n, real *d__, real *e, real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
306 int LPFNAME( dstevd ) (
char *jobz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info );
308 int LPFNAME( cheevd ) (
char *jobz,
char *uplo, integer *n, complex *a, integer *lda, real *w, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info );
309 int LPFNAME( zheevd ) (
char *jobz,
char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info );
311 int LPFNAME( chbevd ) (
char *jobz,
char *uplo, integer *n, integer *kd, complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, real *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info );
312 int LPFNAME( zhbevd ) (
char *jobz,
char *uplo, integer *n, integer *kd, doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, integer *liwork, integer *info );
317 inline real get_real(
const real &r ){
return( r ); }
318 inline doublereal get_real(
const doublereal &r ){
return( r ); }
319 inline real get_real(
const std::complex< real > &r ){
return( r.real( ) ); }
320 inline doublereal get_real(
const std::complex< doublereal > &r ){
return( r.real( ) ); }
325 inline int gemm(
char *transa,
char *transb, integer &m, integer &n, integer &k, real &alpha, real *a, integer &lda, real *b, integer &ldb, real &beta, real *c__, integer &ldc )
327 return( BLFNAME( sgemm ) ( transa, transb, &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c__, &ldc ) );
329 inline int gemm(
char *transa,
char *transb, integer &m, integer &n, integer &k, doublereal &alpha, doublereal *a, integer &lda, doublereal *b, integer &ldb, doublereal &beta, doublereal *c__, integer &ldc )
331 return( BLFNAME( dgemm ) ( transa, transb, &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c__, &ldc ) );
333 inline int gemm(
char *transa,
char *transb, integer &m, integer &n, integer &k, std::complex< real > &alpha, std::complex< real > *a, integer &lda, std::complex< real > *b, integer &ldb, std::complex< real > &beta, std::complex< real > *c__, integer &ldc )
335 return( BLFNAME( cgemm ) ( transa, transb, &m, &n, &k, reinterpret_cast< complex* >( &alpha ), reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( b ), &ldb, reinterpret_cast< complex* >( &beta ), reinterpret_cast< complex* >( c__ ), &ldc ) );
337 inline int gemm(
char *transa,
char *transb, integer &m, integer &n, integer &k, std::complex< doublereal > &alpha, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *b, integer &ldb, std::complex< doublereal > &beta, std::complex< doublereal > *c__, integer &ldc )
339 return( BLFNAME( zgemm ) ( transa, transb, &m, &n, &k, reinterpret_cast< doublecomplex* >( &alpha ), reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( b ), &ldb, reinterpret_cast< doublecomplex* >( &beta ), reinterpret_cast< doublecomplex* >( c__ ), &ldc ) );
343 inline int gemv(
char *trans, integer &m, integer &n, real &alpha, real *a, integer &lda, real *x, integer &incx, real &beta, real *y, integer &incy )
345 return( BLFNAME( sgemv ) ( trans, &m, &n, &alpha, a, &lda, x, &incx, &beta, y, &incy ) );
347 inline int gemv(
char *trans, integer &m, integer &n, doublereal &alpha, doublereal *a, integer &lda, doublereal *x, integer &incx, doublereal &beta, doublereal *y, integer &incy )
349 return( BLFNAME( dgemv ) ( trans, &m, &n, &alpha, a, &lda, x, &incx, &beta, y, &incy ) );
351 inline int gemv(
char *trans, integer &m, integer &n, std::complex< real > &alpha, std::complex< real > *a, integer &lda, std::complex< real > *x, integer &incx, std::complex< real > &beta, std::complex< real > *y, integer &incy )
353 return( BLFNAME( cgemv ) ( trans, &m, &n, reinterpret_cast< complex* >( &alpha ), reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( x ), &incx, reinterpret_cast< complex* >( &beta ), reinterpret_cast< complex* >( y ), &incy ) );
355 inline int gemv(
char *trans, integer &m, integer &n, std::complex< doublereal > &alpha, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *x, integer &incx, std::complex< doublereal > &beta, std::complex< doublereal > *y, integer &incy )
357 return( BLFNAME( zgemv ) ( trans, &m, &n, reinterpret_cast< doublecomplex* >( &alpha ), reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( x ), &incx, reinterpret_cast< doublecomplex* >( &beta ), reinterpret_cast< doublecomplex* >( y ), &incy ) );
364 inline int gesv( integer &n, integer &nrhs, real *a, integer &lda, integer *ipiv, real *b, integer &ldb, integer &info )
366 return( LPFNAME( sgesv ) ( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ) );
368 inline int gesv( integer &n, integer &nrhs, doublereal *a, integer &lda, integer *ipiv, doublereal *b, integer &ldb, integer &info )
370 return( LPFNAME( dgesv ) ( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ) );
372 inline int gesv( integer &n, integer &nrhs, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *b, integer &ldb, integer &info )
374 return( LPFNAME( cgesv ) ( &n, &nrhs, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( b ), &ldb, &info ) );
376 inline int gesv( integer &n, integer &nrhs, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *b, integer &ldb, integer &info )
378 return( LPFNAME( zgesv ) ( &n, &nrhs, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( b ), &ldb, &info ) );
381 inline int gbsv( integer &n, integer &kl, integer &ku, integer &nrhs, real *ab, integer &ldab, integer *ipiv, real *b, integer &ldb, integer &info )
383 return( LPFNAME( sgbsv ) ( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ) );
385 inline int gbsv( integer &n, integer &kl, integer &ku, integer &nrhs, doublereal *ab, integer &ldab, integer *ipiv, doublereal *b, integer &ldb, integer &info )
387 return( LPFNAME( dgbsv ) ( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ) );
389 inline int gbsv( integer &n, integer &kl, integer &ku, integer &nrhs, complex *ab, integer &ldab, integer *ipiv, complex *b, integer &ldb, integer &info )
391 return( LPFNAME( cgbsv ) ( &n, &kl, &ku, &nrhs, reinterpret_cast< complex* >( ab ), &ldab, ipiv, reinterpret_cast< complex* >( b ), &ldb, &info ) );
393 inline int gbsv( integer &n, integer &kl, integer &ku, integer &nrhs, doublecomplex *ab, integer &ldab, integer *ipiv, doublecomplex *b, integer &ldb, integer &info )
395 return( LPFNAME( zgbsv ) ( &n, &kl, &ku, &nrhs, reinterpret_cast< doublecomplex* >( ab ), &ldab, ipiv, reinterpret_cast< doublecomplex* >( b ), &ldb, &info ) );
398 inline int gtsv( integer &n, integer &nrhs, real *dl, real *d__, real *du, real *b, integer &ldb, integer &info )
400 return( LPFNAME( sgtsv ) ( &n, &nrhs, dl, d__, du, b, &ldb, &info ) );
402 inline int gtsv( integer &n, integer &nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal *b, integer &ldb, integer &info )
404 return( LPFNAME( dgtsv ) ( &n, &nrhs, dl, d__, du, b, &ldb, &info ) );
406 inline int gtsv( integer &n, integer &nrhs, complex *dl, complex *d__, complex *du, complex *b, integer &ldb, integer &info )
408 return( LPFNAME( cgtsv ) ( &n, &nrhs, reinterpret_cast< complex* >( dl ), reinterpret_cast< complex* >( d__ ), reinterpret_cast< complex* >( du ), reinterpret_cast< complex* >( b ), &ldb, &info ) );
410 inline int gtsv( integer &n, integer &nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, doublecomplex *b, integer &ldb, integer &info )
412 return( LPFNAME( zgtsv ) ( &n, &nrhs, reinterpret_cast< doublecomplex* >( dl ), reinterpret_cast< doublecomplex* >( d__ ), reinterpret_cast< doublecomplex* >( du ), reinterpret_cast< doublecomplex* >( b ), &ldb, &info ) );
415 inline int sysv(
char *uplo, integer &n, integer &nrhs, real *a, integer &lda, integer *ipiv, real *b, integer &ldb, real *work, integer &lwork, integer &info )
417 return( LPFNAME( ssysv ) ( uplo, &n, &nrhs, a, &lda, ipiv, b, &ldb, work, &lwork, &info ) );
419 inline int sysv(
char *uplo, integer &n, integer &nrhs, doublereal *a, integer &lda, integer *ipiv, doublereal *b, integer &ldb, doublereal *work, integer &lwork, integer &info )
421 return( LPFNAME( dsysv ) ( uplo, &n, &nrhs, a, &lda, ipiv, b, &ldb, work, &lwork, &info ) );
423 inline int sysv(
char *uplo, integer &n, integer &nrhs, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *b, integer &ldb, std::complex< real > *work, integer &lwork, integer &info )
425 return( LPFNAME( csysv ) ( uplo, &n, &nrhs, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( b ), &ldb, reinterpret_cast< complex* >( work ), &lwork, &info ) );
427 inline int sysv(
char *uplo, integer &n, integer &nrhs, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *b, integer &ldb, std::complex< doublereal > *work, integer &lwork, integer &info )
429 return( LPFNAME( zsysv ) ( uplo, &n, &nrhs, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( b ), &ldb, reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
432 inline int hesv(
char *uplo, integer &n, integer &nrhs, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *b, integer &ldb, std::complex< real > *work, integer &lwork, integer&info )
434 return( LPFNAME( chesv ) ( uplo, &n, &nrhs, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( b ), &ldb, reinterpret_cast< complex* >( work ), &lwork, &info ) );
436 inline int hesv(
char *uplo, integer &n, integer &nrhs, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *b, integer &ldb, std::complex< doublereal > *work, integer &lwork, integer &info )
438 return( LPFNAME( zsysv ) ( uplo, &n, &nrhs, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( b ), &ldb, reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
441 inline int pbsv(
char *uplo, integer &n, integer &kd, integer &nrhs, real *ab, integer &ldab, real *b, integer &ldb, integer &info )
443 return( LPFNAME( spbsv ) ( uplo, &n, &kd, &nrhs, ab, &ldab, b, &ldb, &info ) );
445 inline int pbsv(
char *uplo, integer &n, integer &kd, integer &nrhs, doublereal *ab, integer &ldab, doublereal *b, integer &ldb, integer &info )
447 return( LPFNAME( dpbsv ) ( uplo, &n, &kd, &nrhs, ab, &ldab, b, &ldb, &info ) );
449 inline int pbsv(
char *uplo, integer &n, integer &kd, integer &nrhs, std::complex< real > *ab, integer &ldab, std::complex< real > *b, integer &ldb, integer &info )
451 return( LPFNAME( cpbsv ) ( uplo, &n, &kd, &nrhs, reinterpret_cast< complex* >( ab ), &ldab, reinterpret_cast< complex* >( b ), &ldb, &info ) );
453 inline int pbsv(
char *uplo, integer &n, integer &kd, integer &nrhs, std::complex< doublereal > *ab, integer &ldab, std::complex< doublereal > *b, integer &ldb, integer &info )
455 return( LPFNAME( zpbsv ) ( uplo, &n, &kd, &nrhs, reinterpret_cast< doublecomplex* >( ab ), &ldab, reinterpret_cast< doublecomplex* >( b ), &ldb, &info ) );
459 inline int getrf( integer &m, integer &n, real *a, integer &lda, integer *ipiv, integer &info )
461 return( LPFNAME( sgetrf ) ( &m, &n, a, &lda, ipiv, &info ) );
463 inline int getrf( integer &m, integer &n, doublereal *a, integer &lda, integer *ipiv, integer &info )
465 return( LPFNAME( dgetrf ) ( &m, &n, a, &lda, ipiv, &info ) );
467 inline int getrf( integer &m, integer &n, std::complex< real > *a, integer &lda, integer *ipiv, integer &info )
469 return( LPFNAME( cgetrf ) ( &m, &n, reinterpret_cast< complex* >( a ), &lda, ipiv, &info ) );
471 inline int getrf( integer &m, integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, integer &info )
473 return( LPFNAME( zgetrf ) ( &m, &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, &info ) );
476 inline int gbtrf( integer &m, integer &n, integer &kl, integer &ku, real *ab, integer &ldab, integer *ipiv, integer &info )
478 return( LPFNAME( sgbtrf ) ( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ) );
480 inline int gbtrf( integer &m, integer &n, integer &kl, integer &ku, doublereal *ab, integer &ldab, integer *ipiv, integer &info )
482 return( LPFNAME( dgbtrf ) ( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ) );
484 inline int gbtrf( integer &m, integer &n, integer &kl, integer &ku, std::complex< real > *ab, integer &ldab, integer *ipiv, integer &info )
486 return( LPFNAME( cgbtrf ) ( &m, &n, &kl, &ku, reinterpret_cast< complex* >( ab ), &ldab, ipiv, &info ) );
488 inline int gbtrf( integer &m, integer &n, integer &kl, integer &ku, std::complex< doublereal > *ab, integer &ldab, integer *ipiv, integer &info )
490 return( LPFNAME( zgbtrf ) ( &m, &n, &kl, &ku, reinterpret_cast< doublecomplex* >( ab ), &ldab, ipiv, &info ) );
493 inline int gttrf( integer &n, real *dl, real *d__, real *du, real *du2, integer *ipiv, integer &info )
495 return( LPFNAME( sgttrf ) ( &n, dl, d__, du, du2, ipiv, &info ) );
497 inline int gttrf( integer &n, doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, integer &info )
499 return( LPFNAME( dgttrf ) ( &n, dl, d__, du, du2, ipiv, &info ) );
501 inline int gttrf( integer &n, std::complex< real > *dl, std::complex< real > *d__, std::complex< real > *du, std::complex< real > *du2, integer *ipiv, integer &info )
503 return( LPFNAME( cgttrf ) ( &n, reinterpret_cast< complex* >( dl ), reinterpret_cast< complex* >( d__ ), reinterpret_cast< complex* >( du ), reinterpret_cast< complex* >( du2 ), ipiv, &info ) );
505 inline int gttrf( integer &n, std::complex< doublereal > *dl, std::complex< doublereal > *d__, std::complex< doublereal > *du, std::complex< doublereal > *du2, integer *ipiv, integer &info )
507 return( LPFNAME( zgttrf ) ( &n, reinterpret_cast< doublecomplex* >( dl ), reinterpret_cast< doublecomplex* >( d__ ), reinterpret_cast< doublecomplex* >( du ), reinterpret_cast< doublecomplex* >( du2 ), ipiv, &info ) );
510 inline int sytrf(
char *uplo, integer &n, real *a, integer &lda, integer *ipiv, real *work, integer &lwork, integer &info )
512 return( LPFNAME( ssytrf ) ( uplo, &n, a, &lda, ipiv, work, &lwork, &info ) );
514 inline int sytrf(
char *uplo, integer &n, doublereal *a, integer &lda, integer *ipiv, doublereal *work, integer &lwork, integer &info )
516 return( LPFNAME( dsytrf ) ( uplo, &n, a, &lda, ipiv, work, &lwork, &info ) );
518 inline int sytrf(
char *uplo, integer &n, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *work, integer &lwork, integer &info )
520 return( LPFNAME( csytrf ) ( uplo, &n, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( work ), &lwork, &info ) );
522 inline int sytrf(
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *work, integer &lwork, integer &info )
524 return( LPFNAME( zsytrf ) ( uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
527 inline int hetrf(
char *uplo, integer &n, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *work, integer &lwork, integer &info )
529 return( LPFNAME( chetrf ) ( uplo, &n, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( work ), &lwork, &info ) );
531 inline int hetrf(
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *work, integer &lwork, integer &info )
533 return( LPFNAME( zhetrf ) ( uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
537 inline int potrf(
char *uplo, integer &n, real *a, integer &lda, integer &info )
539 return( LPFNAME( spotrf ) ( uplo, &n, a, &lda, &info ) );
541 inline int potrf(
char *uplo, integer &n, doublereal *a, integer &lda, integer &info )
543 return( LPFNAME( dpotrf ) ( uplo, &n, a, &lda, &info ) );
545 inline int potrf(
char *uplo, integer &n, std::complex< real > *a, integer &lda, integer &info )
547 return( LPFNAME( cpotrf ) ( uplo, &n, reinterpret_cast< complex* >( a ), &lda, &info ) );
549 inline int potrf(
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, integer &info )
551 return( LPFNAME( zpotrf ) ( uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, &info ) );
555 inline int geqrf( integer &m, integer &n, real *a, integer &lda, real *tau, real *work, integer &lwork, integer &info )
557 return( LPFNAME( sgeqrf ) ( &m, &n, a, &lda, tau, work, &lwork, &info ) );
559 inline int geqrf( integer &m, integer &n, doublereal *a, integer &lda, doublereal *tau, doublereal *work, integer &lwork, integer &info )
561 return( LPFNAME( dgeqrf ) ( &m, &n, a, &lda, tau, work, &lwork, &info ) );
563 inline int geqrf( integer &m, integer &n, std::complex< real > *a, integer &lda, std::complex< real > *tau, std::complex< real > *work, integer &lwork, integer &info )
565 return( LPFNAME( cgeqrf ) ( &m, &n, reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( tau ), reinterpret_cast< complex* >( work ), &lwork, &info ) );
567 inline int geqrf( integer &m, integer &n, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *tau, std::complex< doublereal > *work, integer &lwork, integer &info )
569 return( LPFNAME( zgeqrf ) ( &m, &n, reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( tau ), reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
573 inline int geqp3( integer &m, integer &n, real *a, integer &lda, integer *jpvt, real *tau, real *work, integer &lwork, integer &info )
575 return( LPFNAME( sgeqp3 ) ( &m, &n, a, &lda, jpvt, tau, work, &lwork, &info ) );
577 inline int geqp3( integer &m, integer &n, doublereal *a, integer &lda, integer *jpvt, doublereal *tau, doublereal *work, integer &lwork, integer &info )
579 return( LPFNAME( dgeqp3 ) ( &m, &n, a, &lda, jpvt, tau, work, &lwork, &info ) );
581 inline int geqp3( integer &m, integer &n, std::complex< real > *a, integer &lda, integer *jpvt, std::complex< real > *tau, std::complex< real > *work, integer &lwork, real *rwork, integer &info )
583 return( LPFNAME( cgeqp3 ) ( &m, &n, reinterpret_cast< complex* >( a ), &lda, jpvt, reinterpret_cast< complex* >( tau ), reinterpret_cast< complex* >( work ), &lwork, rwork, &info ) );
585 inline int geqp3( integer &m, integer &n, std::complex< doublereal > *a, integer &lda, integer *jpvt, std::complex< doublereal > *tau, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &info )
587 return( LPFNAME( zgeqp3 ) ( &m, &n, reinterpret_cast< doublecomplex* >( a ), &lda, jpvt, reinterpret_cast< doublecomplex* >( tau ), reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &info ) );
591 inline int orgqr( integer &m, integer &n, integer &k, real *a, integer &lda, real *tau, real *work, integer &lwork, integer &info )
593 return( LPFNAME( sorgqr ) ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ) );
595 inline int orgqr( integer &m, integer &n, integer &k, doublereal *a, integer &lda, doublereal *tau, doublereal *work, integer &lwork, integer &info )
597 return( LPFNAME( dorgqr ) ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ) );
599 inline int ungqr( integer &m, integer &n, integer &k, std::complex< real > *a, integer &lda, std::complex< real > *tau, std::complex< real > *work, integer &lwork, integer &info )
601 return( LPFNAME( cungqr ) ( &m, &n, &k, reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( tau ), reinterpret_cast< complex* >( work ), &lwork, &info ) );
603 inline int ungqr( integer &m, integer &n, integer &k, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *tau, std::complex< doublereal > *work, integer &lwork, integer &info )
605 return( LPFNAME( zungqr ) ( &m, &n, &k, reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( tau ), reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
609 inline int getri( integer &n, real *a, integer &lda, integer *ipiv, real *work, integer &lwork, integer &info )
611 return( LPFNAME( sgetri ) ( &n, a, &lda, ipiv, work, &lwork, &info ) );
613 inline int getri( integer &n, doublereal *a, integer &lda, integer *ipiv, doublereal *work, integer &lwork, integer &info )
615 return( LPFNAME( dgetri ) ( &n, a, &lda, ipiv, work, &lwork, &info ) );
617 inline int getri( integer &n, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *work, integer &lwork, integer &info )
619 return( LPFNAME( cgetri ) ( &n, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( work ), &lwork, &info ) );
621 inline int getri( integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *work, integer &lwork, integer &info )
623 return( LPFNAME( zgetri ) ( &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( work ), &lwork, &info ) );
626 inline int sytri(
char *uplo, integer &n, real *a, integer &lda, integer *ipiv, real *work, integer &info )
628 return( LPFNAME( ssytri ) ( uplo, &n, a, &lda, ipiv, work, &info ) );
630 inline int sytri(
char *uplo, integer &n, doublereal *a, integer &lda, integer *ipiv, doublereal *work, integer &info )
632 return( LPFNAME( dsytri ) ( uplo, &n, a, &lda, ipiv, work, &info ) );
634 inline int sytri(
char *uplo, integer &n, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *work, integer &info )
636 return( LPFNAME( csytri ) ( uplo, &n, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( work ), &info ) );
638 inline int sytri(
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *work, integer &info )
640 return( LPFNAME( zsytri ) ( uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( work ), &info ) );
643 inline int hetri(
char *uplo, integer &n, std::complex< real > *a, integer &lda, integer *ipiv, std::complex< real > *work, integer &info )
645 return( LPFNAME( chetri ) ( uplo, &n, reinterpret_cast< complex* >( a ), &lda, ipiv, reinterpret_cast< complex* >( work ), &info ) );
647 inline int hetri(
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, integer *ipiv, std::complex< doublereal > *work, integer &info )
649 return( LPFNAME( zhetri ) ( uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, ipiv, reinterpret_cast< doublecomplex* >( work ), &info ) );
654 inline int geev(
char *jobvl,
char *jobvr, integer &n, real *a, integer &lda, real *wr, real *wi,
655 real *vl, integer &ldvl, real *vr, integer &ldvr, real *work, integer &lwork, integer &info )
657 return( LPFNAME( sgeev ) ( jobvl, jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info ) );
659 inline int geev(
char *jobvl,
char *jobvr, integer &n, doublereal *a, integer &lda, doublereal *wr, doublereal *wi,
660 doublereal *vl, integer &ldvl, doublereal *vr, integer &ldvr, doublereal *work, integer &lwork, integer &info )
662 return( LPFNAME( dgeev ) ( jobvl, jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info ) );
664 inline int geev(
char *jobvl,
char *jobvr, integer &n, std::complex< real > *a, integer &lda, std::complex< real > *w, std::complex< real > *vl, integer &ldvl,
665 std::complex< real > *vr, integer &ldvr, std::complex< real > *work, integer &lwork, real *rwork, integer &info )
667 return( LPFNAME( cgeev ) ( jobvl, jobvr, &n, reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( w ), reinterpret_cast< complex* >( vl ), &ldvl,
668 reinterpret_cast< complex* >( vr ), &ldvr, reinterpret_cast< complex* >( work ), &lwork, rwork, &info ) );
670 inline int geev(
char *jobvl,
char *jobvr, integer &n, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *w, std::complex< doublereal > *vl, integer &ldvl,
671 std::complex< doublereal > *vr, integer &ldvr, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &info )
673 return( LPFNAME( zgeev ) ( jobvl, jobvr, &n, reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( w ), reinterpret_cast< doublecomplex* >( vl ), &ldvl,
674 reinterpret_cast< doublecomplex* >( vr ), &ldvr, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &info ) );
677 inline int syev(
char *jobz,
char *uplo, integer &n, real *a, integer &lda, real *w, real *work, integer &lwork, integer &info )
679 return( LPFNAME( ssyev ) ( jobz, uplo, &n, a, &lda, w, work, &lwork, &info ) );
681 inline int syev(
char *jobz,
char *uplo, integer &n, doublereal *a, integer &lda, doublereal *w, doublereal *work, integer &lwork, integer &info )
683 return( LPFNAME( dsyev ) ( jobz, uplo, &n, a, &lda, w, work, &lwork, &info ) );
686 inline int sbev(
char *jobz,
char *uplo, integer &n, integer &kd, real *ab, integer &ldab, real *w, real *z__, integer &ldz, real *work, integer &info )
688 return( LPFNAME( ssbev ) ( jobz, uplo, &n, &kd, ab, &ldab, w, z__, &ldz, work, &info ) );
690 inline int sbev(
char *jobz,
char *uplo, integer &n, integer &kd, doublereal *ab, integer &ldab, doublereal *w, doublereal *z__, integer &ldz, doublereal *work, integer &info )
692 return( LPFNAME( dsbev ) ( jobz, uplo, &n, &kd, ab, &ldab, w, z__, &ldz, work, &info ) );
695 inline int stev(
char *jobz, integer &n, real *d__, real *e, real *z__, integer &ldz, real *work, integer &info )
697 return( LPFNAME( sstev ) ( jobz, &n, d__, e, z__, &ldz, work, &info ) );
699 inline int stev(
char *jobz, integer &n, doublereal *d__, doublereal *e, doublereal *z__, integer &ldz, doublereal *work, integer &info )
701 return( LPFNAME( dstev ) ( jobz, &n, d__, e, z__, &ldz, work, &info ) );
704 inline int heev(
char *jobz,
char *uplo, integer &n, std::complex< real > *a, integer &lda, real *w, std::complex< real > *work, integer &lwork, real *rwork, integer &info )
706 return( LPFNAME( cheev ) ( jobz, uplo, &n, reinterpret_cast< complex* >( a ), &lda, w, reinterpret_cast< complex* >( work ), &lwork, rwork, &info ) );
708 inline int heev(
char *jobz,
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, doublereal *w, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &info )
710 return( LPFNAME( zheev ) ( jobz, uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, w, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &info ) );
713 inline int hbev(
char *jobz,
char *uplo, integer &n, integer &kd, std::complex< real > *ab, integer &ldab, real *w, std::complex< real > *z__, integer &ldz, std::complex< real > *work, real *rwork, integer &info )
715 return( LPFNAME( chbev ) ( jobz, uplo, &n, &kd, reinterpret_cast< complex* >( ab ), &ldab, w, reinterpret_cast< complex* >( z__ ), &ldz, reinterpret_cast< complex* >( work ), rwork, &info ) );
717 inline int hbev(
char *jobz,
char *uplo, integer &n, integer &kd, std::complex< doublereal > *ab, integer &ldab, doublereal *w, std::complex< doublereal > *z__, integer &ldz, std::complex< doublereal > *work, doublereal *rwork, integer &info )
719 return( LPFNAME( zhbev ) ( jobz, uplo, &n, &kd, reinterpret_cast< doublecomplex* >( ab ), &ldab, w, reinterpret_cast< doublecomplex* >( z__ ), &ldz, reinterpret_cast< doublecomplex* >( work ), rwork, &info ) );
725 inline int geevx(
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer &n, real *a, integer &lda, real *wr, real *wi,
726 real *vl, integer &ldvl, real *vr, integer &ldvr, integer &ilo, integer &ihi, real *scale,
727 real &abnrm, real *rconde, real *rcondv, real *work, integer &lwork, integer *iwork, integer &info )
729 return( LPFNAME( sgeevx ) ( balanc, jobvl, jobvr, sense, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, &lwork, iwork, &info ) );
731 inline int geevx(
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer &n, doublereal *a, integer &lda, doublereal *wr, doublereal *wi,
732 doublereal *vl, integer &ldvl, doublereal *vr, integer &ldvr, integer &ilo, integer &ihi, doublereal *scale,
733 doublereal &abnrm, doublereal *rconde, doublereal *rcondv, doublereal *work, integer &lwork, integer *iwork, integer &info )
735 return( LPFNAME( dgeevx ) ( balanc, jobvl, jobvr, sense, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, &lwork, iwork, &info ) );
737 inline int geevx(
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer &n, std::complex< real > *a, integer &lda, std::complex< real > *w,
738 std::complex< real > *vl, integer &ldvl, std::complex< real > *vr, integer &ldvr, integer &ilo, integer &ihi, real *scale,
739 real &abnrm, real *rconde, real *rcondv, std::complex< real > *work, integer &lwork, real *rwork, integer &info )
741 return( LPFNAME( cgeevx ) ( balanc, jobvl, jobvr, sense, &n, reinterpret_cast< complex* >( a ), &lda, reinterpret_cast< complex* >( w ), reinterpret_cast< complex* >( vl ), &ldvl,
742 reinterpret_cast< complex* >( vr ), &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, reinterpret_cast< complex* >( work ), &lwork, rwork, &info ) );
744 inline int geevx(
char *balanc,
char *jobvl,
char *jobvr,
char *sense, integer &n, std::complex< doublereal > *a, integer &lda, std::complex< doublereal > *w,
745 std::complex< doublereal > *vl, integer &ldvl, std::complex< doublereal > *vr, integer &ldvr, integer &ilo, integer &ihi, doublereal *scale,
746 doublereal &abnrm, doublereal *rconde, doublereal *rcondv, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &info )
748 return( LPFNAME( zgeevx ) ( balanc, jobvl, jobvr, sense, &n, reinterpret_cast< doublecomplex* >( a ), &lda, reinterpret_cast< doublecomplex* >( w ), reinterpret_cast< doublecomplex* >( vl ), &ldvl,
749 reinterpret_cast< doublecomplex* >( vr ), &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &info ) );
752 inline int syevx(
char *jobz,
char *range,
char *uplo, integer &n, real *a, integer &lda,
753 real &vl, real &vu, integer &il, integer &iu, real &abstol, integer &m, real *w, real *z__,
754 integer &ldz, real *work, integer &lwork, integer *iwork, integer *ifail, integer &info )
756 return( LPFNAME( ssyevx ) ( jobz, range, uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, &lwork, iwork, ifail, &info ) );
758 inline int syevx(
char *jobz,
char *range,
char *uplo, integer &n, doublereal *a, integer &lda,
759 doublereal &vl, doublereal &vu, integer &il, integer &iu, doublereal &abstol, integer &m, doublereal *w, doublereal *z__,
760 integer &ldz, doublereal *work, integer &lwork, integer *iwork, integer *ifail, integer &info )
762 return( LPFNAME( dsyevx ) ( jobz, range, uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, &lwork, iwork, ifail, &info ) );
765 inline int sbevx(
char *jobz,
char *range,
char *uplo, integer &n, integer &kd, real *ab, integer &ldab, real *q, integer &ldq, real &vl, real &vu, integer &il, integer &iu, real &abstol, integer &m, real *w, real *z__, integer &ldz, real *work, integer *iwork, integer *ifail, integer &info )
767 return( LPFNAME( ssbevx ) ( jobz, range, uplo, &n, &kd, ab, &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, iwork, ifail, &info ) );
769 inline int dsbevx(
char *jobz,
char *range,
char *uplo, integer &n, integer &kd, doublereal *ab, integer &ldab, doublereal *q, integer &ldq, doublereal &vl, doublereal &vu, integer &il, integer &iu, doublereal &abstol, integer &m, doublereal *w, doublereal *z__, integer &ldz, doublereal *work, integer *iwork, integer *ifail, integer &info )
771 return( LPFNAME( dsbevx ) ( jobz, range, uplo, &n, &kd, ab, &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, iwork, ifail, &info ) );
774 inline int stevx(
char *jobz,
char *range, integer &n, real *d__, real *e, real &vl, real &vu, integer &il, integer &iu, real &abstol, integer &m, real *w, real *z__, integer &ldz, real *work, integer *iwork, integer *ifail, integer &info )
776 return( LPFNAME( sstevx ) ( jobz, range, &n, d__, e, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, iwork, ifail, &info ) );
778 inline int stevx(
char *jobz,
char *range, integer &n, doublereal *d__, doublereal *e, doublereal &vl, doublereal &vu, integer &il, integer &iu, doublereal &abstol, integer &m, doublereal *w, doublereal *z__, integer &ldz, doublereal *work, integer *iwork, integer *ifail, integer &info )
780 return( LPFNAME( dstevx ) ( jobz, range, &n, d__, e, &vl, &vu, &il, &iu, &abstol, &m, w, z__, &ldz, work, iwork, ifail, &info ) );
783 inline int heevx(
char *jobz,
char *range,
char *uplo, integer &n, std::complex< real > *a, integer &lda, real &vl, real &vu, integer &il, integer &iu, real &abstol, integer &m, real *w, std::complex< real > *z__, integer &ldz, std::complex< real > *work, integer &lwork, real *rwork, integer *iwork, integer *ifail, integer &info )
785 return( LPFNAME( cheevx ) ( jobz, range, uplo, &n, reinterpret_cast< complex* >( a ), &lda, &vl, &vu, &il, &iu, &abstol, &m, w, reinterpret_cast< complex* >( z__ ), &ldz, reinterpret_cast< complex* >( work ), &lwork, rwork, iwork, ifail, &info ) );
787 inline int heevx(
char *jobz,
char *range,
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, doublereal &vl, doublereal &vu, integer &il, integer &iu, doublereal &abstol, integer &m, doublereal *w, std::complex< doublereal > *z__, integer &ldz, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer *iwork, integer *ifail, integer &info )
789 return( LPFNAME( zheevx ) ( jobz, range, uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, &vl, &vu, &il, &iu, &abstol, &m, w, reinterpret_cast< doublecomplex* >( z__ ), &ldz, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, iwork, ifail, &info ) );
792 inline int hbevx(
char *jobz,
char *range,
char *uplo, integer &n, integer &kd, complex *ab, integer &ldab, complex *q, integer &ldq, real &vl, real &vu, integer &il, integer &iu, real &abstol, integer &m, real *w, complex *z__, integer &ldz, complex *work, real *rwork, integer *iwork, integer *ifail, integer &info )
794 return( LPFNAME( chbevx ) ( jobz, range, uplo, &n, &kd, reinterpret_cast< complex* >( ab ), &ldab, reinterpret_cast< complex* >( q ), &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, reinterpret_cast< complex* >( z__ ), &ldz, reinterpret_cast< complex* >( work ), rwork, iwork, ifail, &info ) );
796 inline int hbevx(
char *jobz,
char *range,
char *uplo, integer &n, integer &kd, complex *ab, integer &ldab, complex *q, integer &ldq, doublereal &vl, doublereal &vu, integer &il, integer &iu, doublereal &abstol, integer &m, doublereal *w, complex *z__, integer &ldz, complex *work, doublereal *rwork, integer *iwork, integer *ifail, integer &info )
798 return( LPFNAME( zhbevx ) ( jobz, range, uplo, &n, &kd, reinterpret_cast< doublecomplex* >( ab ), &ldab, reinterpret_cast< doublecomplex* >( q ), &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, reinterpret_cast< doublecomplex* >( z__ ), &ldz, reinterpret_cast< doublecomplex* >( work ), rwork, iwork, ifail, &info ) );
805 inline int gesvd(
char *jobu,
char *jobvt, integer &m, integer &n, real *a, integer &lda, real *s, real *u,
806 integer &ldu, real *vt, integer &ldvt, real *work, integer &lwork, integer &info )
808 return( LPFNAME( sgesvd ) ( jobu, jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, &info ) );
810 inline int gesvd(
char *jobu,
char *jobvt, integer &m, integer &n, doublereal *a, integer &lda, doublereal *s, doublereal *u,
811 integer &ldu, doublereal *vt, integer &ldvt, doublereal *work, integer &lwork, integer &info )
813 return( LPFNAME( dgesvd ) ( jobu, jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, &info ) );
815 inline int gesvd(
char *jobu,
char *jobvt, integer &m, integer &n, std::complex< real > *a, integer &lda, real *s, std::complex< real > *u,
816 integer &ldu, std::complex< real > *vt, integer &ldvt, std::complex< real > *work, integer &lwork, real *rwork, integer &info )
818 return( LPFNAME( cgesvd ) ( jobu, jobvt, &m, &n, reinterpret_cast< complex* >( a ), &lda, s, reinterpret_cast< complex* >( u ),
819 &ldu, reinterpret_cast< complex* >( vt ), &ldvt, reinterpret_cast< complex* >( work ), &lwork, rwork, &info ) );
821 inline int gesvd(
char *jobu,
char *jobvt, integer &m, integer &n, std::complex< doublereal > *a, integer &lda, doublereal *s, std::complex< doublereal > *u,
822 integer &ldu, std::complex< doublereal > *vt, integer &ldvt, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &info )
824 return( LPFNAME( zgesvd ) ( jobu, jobvt, &m, &n, reinterpret_cast< doublecomplex* >( a ), &lda, s, reinterpret_cast< doublecomplex* >( u ),
825 &ldu, reinterpret_cast< doublecomplex* >( vt ), &ldvt, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &info ) );
829 inline int gesdd(
char *jobz, integer &m, integer &n, real *a, integer &lda, real *s, real *u, integer &ldu,
830 real *vt, integer &ldvt, real *work, integer &lwork, integer *iwork, integer &info )
832 return( LPFNAME( sgesdd ) ( jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info ) );
834 inline int gesdd(
char *jobz, integer &m, integer &n, doublereal *a, integer &lda, doublereal *s, doublereal *u, integer &ldu,
835 doublereal *vt, integer &ldvt, doublereal *work, integer &lwork, integer *iwork, integer &info )
837 return( LPFNAME( dgesdd ) ( jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info ) );
839 inline int gesdd(
char *jobz, integer &m, integer &n, std::complex< real > *a, integer &lda, real *s, std::complex< real > *u, integer &ldu,
840 std::complex< real > *vt, integer &ldvt, std::complex< real > *work, integer &lwork, real *rwork, integer *iwork, integer &info )
842 return( LPFNAME( cgesdd ) ( jobz, &m, &n, reinterpret_cast< complex* >( a ), &lda, s, reinterpret_cast< complex* >( u ), &ldu,
843 reinterpret_cast< complex* >( vt ), &ldvt, reinterpret_cast< complex* >( work ), &lwork, rwork, iwork, &info ) );
845 inline int gesdd(
char *jobz, integer &m, integer &n, std::complex< doublereal > *a, integer &lda, doublereal *s, std::complex< doublereal > *u, integer &ldu,
846 std::complex< doublereal > *vt, integer &ldvt, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer *iwork, integer &info )
848 return( LPFNAME( zgesdd ) ( jobz, &m, &n, reinterpret_cast< doublecomplex* >( a ), &lda, s, reinterpret_cast< doublecomplex* >( u ), &ldu,
849 reinterpret_cast< doublecomplex* >( vt ), &ldvt, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, iwork, &info ) );
854 inline int syevd(
char *jobz,
char *uplo, integer &n, real *a, integer &lda, real *w, real *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
856 return( LPFNAME( ssyevd ) ( jobz, uplo, &n, a, &lda, w, work, &lwork, iwork, &liwork, &info ) );
858 inline int syevd(
char *jobz,
char *uplo, integer &n, doublereal *a, integer &lda, doublereal *w, doublereal *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
860 return( LPFNAME( dsyevd ) ( jobz, uplo, &n, a, &lda, w, work, &lwork, iwork, &liwork, &info ) );
863 inline int sbevd(
char *jobz,
char *uplo, integer &n, integer &kd, real *ab, integer &ldab, real *w, real *z__, integer &ldz, real *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
865 return( LPFNAME( ssbevd ) ( jobz, uplo, &n, &kd, ab, &ldab, w, z__, &ldz, work, &lwork, iwork, &liwork, &info ) );
867 inline int sbevd(
char *jobz,
char *uplo, integer &n, integer &kd, doublereal *ab, integer &ldab, doublereal *w, doublereal *z__, integer &ldz, doublereal *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
869 return( LPFNAME( dsbevd ) ( jobz, uplo, &n, &kd, ab, &ldab, w, z__, &ldz, work, &lwork, iwork, &liwork, &info ) );
872 inline int stevd(
char *jobz, integer &n, real *d__, real *e, real *z__, integer &ldz, real *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
874 return( LPFNAME( sstevd ) ( jobz, &n, d__, e, z__, &ldz, work, &lwork, iwork, &liwork, &info ) );
876 inline int stevd(
char *jobz, integer &n, doublereal *d__, doublereal *e, doublereal *z__, integer &ldz, doublereal *work, integer &lwork, integer *iwork, integer &liwork, integer &info )
878 return( LPFNAME( dstevd ) ( jobz, &n, d__, e, z__, &ldz, work, &lwork, iwork, &liwork, &info ) );
881 inline int heevd(
char *jobz,
char *uplo, integer &n, std::complex< real > *a, integer &lda, real *w, std::complex< real > *work, integer &lwork, real *rwork, integer &lrwork, integer *iwork, integer &liwork, integer &info )
883 return( LPFNAME( cheevd ) ( jobz, uplo, &n, reinterpret_cast< complex* >( a ), &lda, w, reinterpret_cast< complex* >( work ), &lwork, rwork, &lrwork, iwork, &liwork, &info ) );
885 inline int heevd(
char *jobz,
char *uplo, integer &n, std::complex< doublereal > *a, integer &lda, doublereal *w, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &lrwork, integer *iwork, integer &liwork, integer &info )
887 return( LPFNAME( zheevd ) ( jobz, uplo, &n, reinterpret_cast< doublecomplex* >( a ), &lda, w, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &lrwork, iwork, &liwork, &info ) );
890 inline int hbevd(
char *jobz,
char *uplo, integer &n, integer &kd, std::complex< real > *ab, integer &ldab, real *w, std::complex< real > *z__, integer &ldz, std::complex< real > *work, integer &lwork, real *rwork, integer &lrwork, integer *iwork, integer &liwork, integer &info )
892 return( LPFNAME( chbevd ) ( jobz, uplo, &n, &kd, reinterpret_cast< complex* >( ab ), &ldab, w, reinterpret_cast< complex* >( z__ ), &ldz, reinterpret_cast< complex* >( work ), &lwork, rwork, &lrwork, iwork, &liwork, &info ) );
894 inline int hbevd(
char *jobz,
char *uplo, integer &n, integer &kd, std::complex< doublereal > *ab, integer &ldab, doublereal *w, std::complex< doublereal > *z__, integer &ldz, std::complex< doublereal > *work, integer &lwork, doublereal *rwork, integer &lrwork, integer *iwork, integer &liwork, integer &info )
896 return( LPFNAME( zhbevd ) ( jobz, uplo, &n, &kd, reinterpret_cast< doublecomplex* >( ab ), &ldab, w, reinterpret_cast< doublecomplex* >( z__ ), &ldz, reinterpret_cast< doublecomplex* >( work ), &lwork, rwork, &lrwork, iwork, &liwork, &info ) );
905 class __value_index_pair__
908 typedef size_t size_type;
909 typedef T value_type;
914 __value_index_pair__( ){ }
916 __value_index_pair__( value_type v, size_type indx ) : value( v ), index( indx ){ }
918 static bool ascending(
const __value_index_pair__ &a,
const __value_index_pair__ &b )
920 return( a.value < b.value );
923 static bool descending(
const __value_index_pair__ &a,
const __value_index_pair__ &b )
925 return( a.value > b.value );
930 class __value_index_pair__< std::complex< T > >
933 typedef size_t size_type;
934 typedef std::complex< T > value_type;
939 __value_index_pair__( ){ }
941 __value_index_pair__( value_type v, size_type indx ) : value( v ), index( indx ){ }
943 static bool ascending(
const __value_index_pair__ &a,
const __value_index_pair__ &b )
945 if( a.value.real( ) < b.value.real( ) )
949 else if( a.value.real( ) > b.value.real( ) )
955 return( a.value.imag( ) < b.value.imag( ) );
959 static bool descending(
const __value_index_pair__ &a,
const __value_index_pair__ &b )
961 if( a.value.real( ) > b.value.real( ) )
965 else if( a.value.real( ) < b.value.real( ) )
971 return( a.value.imag( ) > b.value.imag( ) );
976 inline const std::string to_string( integer value )
979 sprintf( buff,
"%ld", value );
980 return( std::string( buff ) );
992 template <
class T,
class Allocator >
993 static matrix< T, Allocator >& solve( matrix< T, Allocator > &a, matrix< T, Allocator > &b, matrix_style::style style )
995 typedef __clapack__::integer integer;
996 typedef typename matrix< T, Allocator >::value_type value_type;
1002 case matrix_style::sy:
1004 if( a.rows( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1007 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1011 integer n =
static_cast< integer
>( a.cols( ) );
1012 integer nrhs =
static_cast< integer
>( b.cols( ) );
1013 integer lda =
static_cast< integer
>( a.rows( ) );
1014 integer ldb =
static_cast< integer
>( b.rows( ) );
1016 integer *ipiv =
new integer[ n ];
1021 __clapack__::sysv( uplo, n, nrhs, NULL, lda, NULL, NULL, ldb, &dmy, lwork, info );
1024 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1025 matrix< T, Allocator > work( lwork, 1 );
1026 __clapack__::sysv( uplo, n, nrhs, &( a[0] ), lda, ipiv, &( b[0] ), ldb, &( work[0] ), lwork, info );
1033 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1038 std::string val = __clapack__::to_string( info );
1039 std::string msg =
"D( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the block diagonal matrix D is exactly singular, so the solution could not be computed.";
1040 throw( numerical_exception( info, msg ) );
1045 case matrix_style::pb:
1047 if( a.cols( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1050 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1054 integer n =
static_cast< integer
>( a.cols( ) );
1055 integer kd =
static_cast< integer
>( a.rows( ) ) - 1;
1056 integer nrhs =
static_cast< integer
>( b.cols( ) );
1057 integer ldab =
static_cast< integer
>( a.rows( ) );
1058 integer ldb =
static_cast< integer
>( b.rows( ) );
1061 __clapack__::pbsv( uplo, n, kd, nrhs, &( a[0] ), ldab, &( b[0] ), ldb, info );
1066 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1071 std::string val = __clapack__::to_string( info );
1072 std::string msg =
"The leading minor of order " + val +
" of A is not positive definite, so the factorization could not be completed, and the solution has not been computed.";
1073 throw( numerical_exception( info, msg ) );
1078 case matrix_style::ge:
1081 if( a.rows( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1084 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1088 integer n =
static_cast< integer
>( a.cols( ) );
1089 integer nrhs =
static_cast< integer
>( b.cols( ) );
1090 integer lda =
static_cast< integer
>( a.rows( ) );
1091 integer ldb =
static_cast< integer
>( b.rows( ) );
1092 integer *ipiv =
new integer[ n ];
1105 __clapack__::gesv( n, nrhs, &( a[0] ), lda, ipiv, &( b[0] ), ldb, info );
1111 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1116 std::string val = __clapack__::to_string( info );
1117 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the factor U is exactly singular, so the solution could not be computed";
1118 throw( numerical_exception( info, msg ) );
1129 struct __solve__< true >
1132 template <
class T,
class Allocator >
1133 static matrix< T, Allocator >& solve( matrix< T, Allocator > a, matrix< T, Allocator > &b, matrix_style::style style )
1135 typedef __clapack__::integer integer;
1136 typedef typename T::value_type value_type;
1142 case matrix_style::sy:
1144 if( a.rows( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1147 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1151 integer n =
static_cast< integer
>( a.cols( ) );
1152 integer nrhs =
static_cast< integer
>( b.cols( ) );
1153 integer lda =
static_cast< integer
>( a.rows( ) );
1154 integer ldb =
static_cast< integer
>( b.rows( ) );
1156 integer *ipiv =
new integer[ n ];
1161 __clapack__::sysv( uplo, n, nrhs, NULL, lda, NULL, NULL, ldb, &dmy, lwork, info );
1164 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1165 matrix< T, Allocator > work( lwork, 1 );
1166 __clapack__::sysv( uplo, n, nrhs, &( a[0] ), lda, ipiv, &( b[0] ), ldb, &( work[0] ), lwork, info );
1173 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1178 std::string val = __clapack__::to_string( info );
1179 std::string msg =
"D( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the block diagonal matrix D is exactly singular, so the solution could not be computed.";
1180 throw( numerical_exception( info, msg ) );
1185 case matrix_style::pb:
1187 if( a.cols( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1190 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1194 integer n =
static_cast< integer
>( a.cols( ) );
1195 integer kd =
static_cast< integer
>( a.rows( ) ) - 1;
1196 integer nrhs =
static_cast< integer
>( b.cols( ) );
1197 integer ldab =
static_cast< integer
>( a.rows( ) );
1198 integer ldb =
static_cast< integer
>( b.rows( ) );
1201 __clapack__::pbsv( uplo, n, kd, nrhs, &( a[0] ), ldab, &( b[0] ), ldb, info );
1206 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1211 std::string val = __clapack__::to_string( info );
1212 std::string msg =
"The leading minor of order " + val +
" of A is not positive definite, so the factorization could not be completed, and the solution has not been computed.";
1213 throw( numerical_exception( info, msg ) );
1218 case matrix_style::ge:
1221 if( a.rows( ) != b.rows( ) || a.empty( ) || b.empty( ) )
1224 throw( numerical_exception( 1,
"Incorrect matrix size is specified." ) );
1228 integer n =
static_cast< integer
>( a.cols( ) );
1229 integer nrhs =
static_cast< integer
>( b.cols( ) );
1230 integer lda =
static_cast< integer
>( a.rows( ) );
1231 integer ldb =
static_cast< integer
>( b.rows( ) );
1232 integer *ipiv =
new integer[ n ];
1245 __clapack__::gesv( n, nrhs, &( a[0] ), lda, ipiv, &( b[0] ), ldb, info );
1251 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1256 std::string val = __clapack__::to_string( info );
1257 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the factor U is exactly singular, so the solution could not be computed";
1258 throw( numerical_exception( info, msg ) );
1279 template <
class T,
class Allocator1,
class Allocator2 >
1280 static matrix< T, Allocator1 >&
lu_factorization( matrix< T, Allocator1 > &a, matrix< __clapack__::integer, Allocator2 > &pivot, matrix_style::style style )
1282 typedef __clapack__::integer integer;
1283 typedef typename matrix< T, Allocator1 >::value_type value_type;
1288 throw( numerical_exception( 1,
"Empty matrix." ) );
1295 case matrix_style::sy:
1296 case matrix_style::ge:
1300 integer m =
static_cast< integer
>( a.rows( ) );
1301 integer n =
static_cast< integer
>( a.cols( ) );
1304 pivot.resize( n, 1 );
1307 __clapack__::getrf( m, n, &( a[0] ), lda, &( pivot[0] ), info );
1315 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1320 std::string val = __clapack__::to_string( info );
1321 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the factor U is exactly singular, and division by zero will occur if it is used to solve a system of equations.";
1322 throw( numerical_exception( info, msg ) );
1330 struct __lu__< true >
1333 template <
class T,
class Allocator1,
class Allocator2 >
1334 static matrix< T, Allocator1 >&
lu_factorization( matrix< T, Allocator1 > &a, matrix< __clapack__::integer, Allocator2 > &pivot, matrix_style::style style )
1336 typedef __clapack__::integer integer;
1337 typedef typename T::value_type value_type;
1342 throw( numerical_exception( 1,
"Empty matrix." ) );
1349 case matrix_style::sy:
1350 case matrix_style::ge:
1354 integer m =
static_cast< integer
>( a.rows( ) );
1355 integer n =
static_cast< integer
>( a.cols( ) );
1358 pivot.resize( n, 1 );
1361 __clapack__::getrf( m, n, &( a[0] ), lda, &( pivot[0] ), info );
1369 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1374 std::string val = __clapack__::to_string( info );
1375 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the factor U is exactly singular, and division by zero will occur if it is used to solve a system of equations.";
1376 throw( numerical_exception( info, msg ) );
1394 template <
class T,
class Allocator >
1395 static void qr_factorization( matrix< T, Allocator > &A, matrix< T, Allocator > &Q, matrix< T, Allocator > &R, matrix_style::style style )
1397 typedef __clapack__::integer integer;
1398 typedef typename matrix< T, Allocator >::value_type value_type;
1399 typedef typename matrix< T, Allocator >::size_type size_type;
1404 throw( numerical_exception( 1,
"Empty matrix." ) );
1406 else if( A.rows( ) < A.cols( ) )
1409 throw( numerical_exception( 1,
"The number of rows should be larger than the number of columns." ) );
1416 case matrix_style::sy:
1417 case matrix_style::ge:
1421 matrix< T, Allocator > &a = A;
1422 integer m =
static_cast< integer
>( a.rows( ) );
1423 integer n =
static_cast< integer
>( a.cols( ) );
1424 integer dim = m < n ? m : n;
1426 typename matrix< T, Allocator >::value_type dmy;
1430 __clapack__::geqrf( m, n, NULL, lda, NULL, &dmy, lwork, info );
1433 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1434 matrix< T, Allocator > work( lwork, 1 ), tau( dim, 1 );
1435 __clapack__::geqrf( m, n, &( a[0] ), lda, &( tau[0] ), &( work[0] ), lwork, info );
1442 for( size_type c = 0 ; c < R.cols( ) ; c++ )
1444 for( size_type r = 0 ; r <= c ; r++ )
1446 R( r, c ) = a( r, c );
1448 for( size_type r = 0 ; r < R.rows( ) ; r++ )
1450 Q( r, c ) = a( r, c );
1454 __clapack__::orgqr( m, m, dim, &( Q[0] ), lda, &( tau[0] ), &( work[0] ), lwork, info );
1464 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1470 struct __qr__< true >
1473 template <
class T,
class Allocator >
1474 static void qr_factorization( matrix< T, Allocator > &A, matrix< T, Allocator > &Q, matrix< T, Allocator > &R, matrix_style::style style )
1476 typedef __clapack__::integer integer;
1477 typedef typename matrix< T, Allocator >::value_type value_type;
1478 typedef typename matrix< T, Allocator >::size_type size_type;
1483 throw( numerical_exception( 1,
"Empty matrix." ) );
1485 else if( A.rows( ) < A.cols( ) )
1488 throw( numerical_exception( 1,
"The number of rows should be larger than the number of columns." ) );
1495 case matrix_style::ge:
1499 matrix< T, Allocator > &a = A;
1500 integer m =
static_cast< integer
>( a.rows( ) );
1501 integer n =
static_cast< integer
>( a.cols( ) );
1502 integer dim = m < n ? m : n;
1504 typename matrix< T, Allocator >::value_type dmy;
1508 __clapack__::geqrf( m, n, NULL, lda, NULL, &dmy, lwork, info );
1511 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1512 matrix< T, Allocator > work( lwork, 1 ), tau( dim, 1 );
1513 __clapack__::geqrf( m, n, &( a[0] ), lda, &( tau[0] ), &( work[0] ), lwork, info );
1520 for( size_type c = 0 ; c < R.cols( ) ; c++ )
1522 for( size_type r = 0 ; r <= c ; r++ )
1524 R( r, c ) = a( r, c );
1526 for( size_type r = 0 ; r < R.rows( ) ; r++ )
1528 Q( r, c ) = a( r, c );
1532 __clapack__::ungqr( m, n, dim, &( Q[0] ), lda, &( tau[0] ), &( work[0] ), lwork, info );
1542 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1549 namespace __cholesky__
1552 template <
class T,
class Allocator >
1553 static matrix< T, Allocator >& cholesky_factorization( matrix< T, Allocator > &a, matrix_style::style style )
1555 typedef matrix< T, Allocator > matrix_type;
1556 typedef typename matrix_type::value_type value_type;
1557 typedef typename matrix_type::size_type size_type;
1558 typedef __clapack__::integer integer;
1563 throw( numerical_exception( 1,
"Empty matrix." ) );
1565 else if( a.rows( ) != a.cols( ) )
1568 throw( numerical_exception( 1,
"The number of rows should be equal to the number of columns." ) );
1574 for( size_type r = 0 ; r < a.rows( ) ; r++ )
1576 for( size_type c = r + 1 ; c < a.cols( ) ; c++ )
1578 a( r, c ) =
static_cast< value_type
>( 0 );
1584 case matrix_style::sy:
1589 integer n =
static_cast< integer
>( a.cols( ) );
1590 integer lda =
static_cast< integer
>( a.rows( ) );
1594 __clapack__::potrf( uplo, n, &( a[0] ), lda, info );
1602 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1607 std::string val = __clapack__::to_string( info );
1608 std::string msg =
"The leading minor of order " + val +
" is not positive definite, and the factorization could not be completed.";
1609 throw( numerical_exception( info, msg ) );
1617 namespace __inverse__
1624 template <
class T,
class Allocator >
1625 static matrix< T, Allocator >&
inverse( matrix< T, Allocator > &a, matrix_style::style style )
1627 typedef matrix< T, Allocator > matrix_type;
1628 typedef typename matrix< T, Allocator >::value_type value_type;
1629 typedef __clapack__::integer integer;
1634 throw( numerical_exception( 1,
"Empty matrix." ) );
1639 if( a.rows( ) == a.cols( ) )
1646 double a11 = a( 0, 0 );
1647 double a12 = a( 0, 1 );
1648 double a21 = a( 1, 0 );
1649 double a22 = a( 1, 1 );
1650 double detA = a11 * a22 - a12 * a21;
1653 a( 0, 0 ) =
static_cast< value_type
>( a22 / detA );
1654 a( 0, 1 ) =
static_cast< value_type
>( -a12 / detA );
1655 a( 1, 0 ) =
static_cast< value_type
>( -a21 / detA );
1656 a( 1, 1 ) =
static_cast< value_type
>( a11 / detA );
1662 throw( numerical_exception( 1,
"Determinant of the matrix is zero." ) );
1669 double a11 = a( 0, 0 ), a12 = a( 0, 1 ), a13 = a( 0, 2 );
1670 double a21 = a( 1, 0 ), a22 = a( 1, 1 ), a23 = a( 1, 2 );
1671 double a31 = a( 2, 0 ), a32 = a( 2, 1 ), a33 = a( 2, 2 );
1674 double _22x33_23x32_ = a22 * a33 - a23 * a32;
1675 double _21x32_22x31_ = a21 * a32 - a22 * a31;
1676 double _23x31_21x33_ = a23 * a31 - a21 * a33;
1679 double detA = a11 * _22x33_23x32_ + a13 * _21x32_22x31_ + a12 * _23x31_21x33_;
1685 double A11 = _22x33_23x32_;
1686 double A12 = a13 * a32 - a12 * a33;
1687 double A13 = a12 * a23 - a13 * a22;
1688 double A21 = _23x31_21x33_;
1689 double A22 = a11 * a33 - a13 * a31;
1690 double A23 = a13 * a21 - a11 * a23;
1691 double A31 = _21x32_22x31_;
1692 double A32 = a12 * a31 - a11 * a32;
1693 double A33 = a11 * a22 - a12 * a21;
1695 double _1_detA = 1.0 / detA;
1696 a( 0, 0 ) =
static_cast< value_type
>( A11 * _1_detA );
1697 a( 0, 1 ) =
static_cast< value_type
>( A12 * _1_detA );
1698 a( 0, 2 ) =
static_cast< value_type
>( A13 * _1_detA );
1699 a( 1, 0 ) =
static_cast< value_type
>( A21 * _1_detA );
1700 a( 1, 1 ) =
static_cast< value_type
>( A22 * _1_detA );
1701 a( 1, 2 ) =
static_cast< value_type
>( A23 * _1_detA );
1702 a( 2, 0 ) =
static_cast< value_type
>( A31 * _1_detA );
1703 a( 2, 1 ) =
static_cast< value_type
>( A32 * _1_detA );
1704 a( 2, 2 ) =
static_cast< value_type
>( A33 * _1_detA );
1711 throw( numerical_exception( 1,
"Determinant of the matrix is zero." ) );
1718 double a11 = a( 0, 0 ), a12 = a( 0, 1 ), a13 = a( 0, 2 ), a14 = a( 0, 3 );
1719 double a21 = a( 1, 0 ), a22 = a( 1, 1 ), a23 = a( 1, 2 ), a24 = a( 1, 3 );
1720 double a31 = a( 2, 0 ), a32 = a( 2, 1 ), a33 = a( 2, 2 ), a34 = a( 2, 3 );
1721 double a41 = a( 3, 0 ), a42 = a( 3, 1 ), a43 = a( 3, 2 ), a44 = a( 3, 3 );
1724 double _33x44_34x43_ = a33 * a44 - a34 * a43;
1725 double _34x42_32x44_ = a34 * a42 - a32 * a44;
1726 double _32x43_33x42_ = a32 * a43 - a33 * a42;
1727 double _31x44_34x41_ = a31 * a44 - a34 * a41;
1728 double _33x41_31x43_ = a33 * a41 - a31 * a43;
1729 double _31x42_32x41_ = a31 * a42 - a32 * a41;
1732 double detA = a11 * ( a22 * _33x44_34x43_ + a23 * _34x42_32x44_ + a24 * _32x43_33x42_ )
1733 - a12 * ( a21 * _33x44_34x43_ - a23 * _31x44_34x41_ - a24 * _33x41_31x43_ )
1734 - a13 * ( a21 * _34x42_32x44_ + a22 * _31x44_34x41_ - a24 * _31x42_32x41_ )
1735 - a14 * ( a21 * _32x43_33x42_ + a22 * _33x41_31x43_ + a23 * _31x42_32x41_ );
1741 double _23x44_24x43_ = a23 * a44 - a24 * a43;
1742 double _24x42_22x44_ = a24 * a42 - a22 * a44;
1743 double _22x43_23x42_ = a22 * a43 - a23 * a42;
1744 double _24x33_23x34_ = a24 * a33 - a23 * a34;
1745 double _22x34_24x32_ = a22 * a34 - a24 * a32;
1746 double _23x32_22x33_ = a23 * a32 - a22 * a33;
1747 double _21x44_24x41_ = a21 * a44 - a24 * a41;
1748 double _23x41_21x43_ = a23 * a41 - a21 * a43;
1749 double _24x31_21x34_ = a24 * a31 - a21 * a34;
1750 double _21x33_23x31_ = a21 * a33 - a23 * a31;
1751 double _21x42_22x41_ = a21 * a42 - a22 * a41;
1752 double _22x31_21x32_ = a22 * a31 - a21 * a32;
1755 double A11 = a22 * _33x44_34x43_ + a23 * _34x42_32x44_ + a24 * _32x43_33x42_;
1756 double A12 = -a12 * _33x44_34x43_ - a13 * _34x42_32x44_ - a14 * _32x43_33x42_;
1757 double A13 = a12 * _23x44_24x43_ + a13 * _24x42_22x44_ + a14 * _22x43_23x42_;
1758 double A14 = a12 * _24x33_23x34_ + a13 * _22x34_24x32_ + a14 * _23x32_22x33_;
1759 double A21 = -a21 * _33x44_34x43_ + a23 * _31x44_34x41_ + a24 * _33x41_31x43_;
1760 double A22 = a11 * _33x44_34x43_ - a13 * _31x44_34x41_ - a14 * _33x41_31x43_;
1761 double A23 = -a11 * _23x44_24x43_ + a13 * _21x44_24x41_ + a14 * _23x41_21x43_;
1762 double A24 = -a11 * _24x33_23x34_ + a13 * _24x31_21x34_ + a14 * _21x33_23x31_;
1763 double A31 = -a21 * _34x42_32x44_ - a22 * _31x44_34x41_ + a24 * _31x42_32x41_;
1764 double A32 = a11 * _34x42_32x44_ + a12 * _31x44_34x41_ - a14 * _31x42_32x41_;
1765 double A33 = -a11 * _24x42_22x44_ - a12 * _21x44_24x41_ + a14 * _21x42_22x41_;
1766 double A34 = -a11 * _22x34_24x32_ - a12 * _24x31_21x34_ + a14 * _22x31_21x32_;
1767 double A41 = -a21 * _32x43_33x42_ - a22 * _33x41_31x43_ - a23 * _31x42_32x41_;
1768 double A42 = a11 * _32x43_33x42_ + a12 * _33x41_31x43_ + a13 * _31x42_32x41_;
1769 double A43 = -a11 * _22x43_23x42_ - a12 * _23x41_21x43_ - a13 * _21x42_22x41_;
1770 double A44 = -a11 * _23x32_22x33_ - a12 * _21x33_23x31_ - a13 * _22x31_21x32_;
1772 double _1_detA = 1.0 / detA;
1773 a( 0, 0 ) =
static_cast< value_type
>( A11 * _1_detA );
1774 a( 0, 1 ) =
static_cast< value_type
>( A12 * _1_detA );
1775 a( 0, 2 ) =
static_cast< value_type
>( A13 * _1_detA );
1776 a( 0, 3 ) =
static_cast< value_type
>( A14 * _1_detA );
1777 a( 1, 0 ) =
static_cast< value_type
>( A21 * _1_detA );
1778 a( 1, 1 ) =
static_cast< value_type
>( A22 * _1_detA );
1779 a( 1, 2 ) =
static_cast< value_type
>( A23 * _1_detA );
1780 a( 1, 3 ) =
static_cast< value_type
>( A24 * _1_detA );
1781 a( 2, 0 ) =
static_cast< value_type
>( A31 * _1_detA );
1782 a( 2, 1 ) =
static_cast< value_type
>( A32 * _1_detA );
1783 a( 2, 2 ) =
static_cast< value_type
>( A33 * _1_detA );
1784 a( 2, 3 ) =
static_cast< value_type
>( A34 * _1_detA );
1785 a( 3, 0 ) =
static_cast< value_type
>( A41 * _1_detA );
1786 a( 3, 1 ) =
static_cast< value_type
>( A42 * _1_detA );
1787 a( 3, 2 ) =
static_cast< value_type
>( A43 * _1_detA );
1788 a( 3, 3 ) =
static_cast< value_type
>( A44 * _1_detA );
1794 throw( numerical_exception( 1,
"Determinant of the matrix is zero." ) );
1808 case matrix_style::sy:
1811 integer n =
static_cast< integer
>( a.cols( ) );
1812 integer lda =
static_cast< integer
>( a.rows( ) );
1813 integer *ipiv =
new integer[ n ];
1814 typename matrix< T, Allocator >::value_type dmy;
1820 __clapack__::sytrf( uplo, n, NULL, lda, ipiv, &dmy, lwork, info );
1823 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1824 matrix< T, Allocator > work( lwork, 1 );
1825 __clapack__::sytrf( uplo, n, &( a[0] ), lda, ipiv, &( work[0] ), lwork, info );
1831 work.resize( n, 1 );
1833 __clapack__::sytri( uplo, n, &( a[0] ), lda, ipiv, &( work[0] ), info );
1838 typedef typename matrix< T, Allocator >::size_type size_type;
1839 for( size_type c = 0 ; c < a.rows( ) ; c++ )
1841 for( size_type r = c + 1 ; r < a.rows( ) ; r++ )
1843 a( r, c ) = a( c, r );
1853 case matrix_style::ge:
1857 integer n =
static_cast< integer
>( a.cols( ) );
1858 integer lda =
static_cast< integer
>( a.rows( ) );
1859 integer *ipiv =
new integer[ n ];
1860 typename matrix< T, Allocator >::value_type dmy;
1864 __clapack__::getrf( lda, n, &( a[0] ), lda, ipiv, info );
1868 __clapack__::getri( n, NULL, lda, NULL, &dmy, lwork, info );
1871 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1872 matrix< T, Allocator > work( lwork, 1 );
1873 __clapack__::getri( n, &( a[0] ), lda, ipiv, &( work[0] ), lwork, info );
1885 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
1890 std::string val = __clapack__::to_string( info );
1891 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. the matrix is singular and its inverse could not be computed";
1892 throw( numerical_exception( info, msg ) );
1900 struct __inverse__< true >
1903 template <
class T,
class Allocator >
1904 static matrix< T, Allocator >&
inverse( matrix< T, Allocator > &a, matrix_style::style style )
1906 typedef __clapack__::integer integer;
1907 typedef typename T::value_type value_type;
1912 throw( numerical_exception( 1,
"Empty matrix." ) );
1919 case matrix_style::sy:
1922 integer n =
static_cast< integer
>( a.cols( ) );
1923 integer lda =
static_cast< integer
>( a.rows( ) );
1924 integer *ipiv =
new integer[ n ];
1925 typename matrix< T, Allocator >::value_type dmy;
1931 __clapack__::sytrf( uplo, n, NULL, lda, ipiv, &dmy, lwork, info );
1934 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1935 matrix< T, Allocator > work( lwork, 1 );
1936 __clapack__::sytrf( uplo, n, &( a[0] ), lda, ipiv, &( work[0] ), lwork, info );
1942 work.resize( 2 * n, 1 );
1944 __clapack__::sytri( uplo, n, &( a[0] ), lda, ipiv, &( work[0] ), info );
1949 typedef typename matrix< T, Allocator >::size_type size_type;
1950 for( size_type c = 0 ; c < a.rows( ) ; c++ )
1952 for( size_type r = c + 1 ; r < a.rows( ) ; r++ )
1954 a( r, c ) = a( c, r );
1964 case matrix_style::ge:
1968 integer n =
static_cast< integer
>( a.cols( ) );
1969 integer lda =
static_cast< integer
>( a.rows( ) );
1970 integer *ipiv =
new integer[ n ];
1971 typename matrix< T, Allocator >::value_type dmy;
1975 __clapack__::getrf( lda, n, &( a[0] ), lda, ipiv, info );
1979 __clapack__::getri( n, NULL, lda, NULL, &dmy, lwork, info );
1982 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
1983 matrix< T, Allocator > work( lwork, 1 );
1984 __clapack__::getri( n, &( a[0] ), lda, ipiv, &( work[0] ), lwork, info );
1995 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2000 std::string val = __clapack__::to_string( info );
2001 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. the matrix is singular and its inverse could not be computed";
2002 throw( numerical_exception( info, msg ) );
2015 #if defined(_USE_BALANCING_MATRIX_EIGEN_) && _USE_BALANCING_MATRIX_EIGEN_ != 0
2022 template <
class T,
class Allocator >
2023 static matrix< T, Allocator >&
eigen( matrix< T, Allocator > &a, matrix< T, Allocator > &eigen_value, matrix< T, Allocator > &eigen_vector, matrix_style::style style )
2025 typedef __clapack__::integer integer;
2026 typedef typename matrix< T, Allocator >::value_type value_type;
2031 throw( numerical_exception( 1,
"Empty matrix." ) );
2038 case matrix_style::sy:
2041 integer n =
static_cast< integer
>( a.cols( ) );
2043 integer lda =
static_cast< integer
>( a.rows( ) );
2051 value_type abstol = 0;
2057 __clapack__::syevx( jobz, range, uplo, n, NULL, lda, vl, vu, il, iu, abstol, m, NULL, NULL, ldz, &dmy, lwork, NULL, NULL, info );
2060 eigen_value.resize( n, 1 );
2061 matrix< integer > iwork( 5 * n, 1 );
2062 matrix< integer > ifail( n, 1 );
2063 eigen_vector.resize( n, n );
2065 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2066 matrix< T, Allocator > work( lwork, 1 );
2067 __clapack__::syevx( jobz, range, uplo, n, &( a[0] ), lda, vl, vu, il, iu, abstol, m,
2068 &( eigen_value[0] ), &( eigen_vector[0] ), ldz, &( work[0] ), lwork, &( iwork[ 0 ] ), &( ifail[ 0 ] ), info );
2074 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2079 throw( numerical_exception( info, __clapack__::to_string( info ) +
" eigenvectors failed to converge." ) );
2084 case matrix_style::ge:
2088 integer n =
static_cast< integer
>( a.cols( ) );
2089 integer lda =
static_cast< integer
>( a.rows( ) );
2090 typename matrix< T, Allocator >::value_type dmy, abnrm;
2096 char balanc[] =
"B";
2102 __clapack__::geevx( balanc, jobvl, jobvr, sense, n, NULL, lda, NULL, NULL, NULL, ldvl, NULL, ldvr, ilo, ihi, NULL, abnrm, NULL, NULL, &dmy, lwork, NULL, info );
2105 eigen_value.resize( n, 1 );
2106 matrix< T, Allocator > tmp( n, 1 );
2107 matrix< T, Allocator > scale( n, 1 );
2108 eigen_vector.resize( n, n );
2110 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2111 matrix< T, Allocator > work( lwork, 1 );
2112 __clapack__::geevx( balanc, jobvl, jobvr, sense, n, &( a[0] ), lda, &( eigen_value[0] ), &( tmp[0] ),
2113 NULL, ldvl, &( eigen_vector[0] ), ldvr, ilo, ihi, &( scale[0] ), abnrm, NULL, NULL, &( work[0] ), lwork, NULL, info );
2119 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2124 throw( numerical_exception( info,
"QR algorithm failed to compute all the eigenvalues, and no eigenvectors or condition numbers have been computed." ) );
2130 return( eigen_value );
2135 struct __eigen__< true >
2138 template <
class T,
class Allocator >
2139 static matrix< T, Allocator >&
eigen( matrix< T, Allocator > &a, matrix< T, Allocator > &eigen_value, matrix< T, Allocator > &eigen_vector, matrix_style::style style )
2141 typedef __clapack__::integer integer;
2142 typedef typename T::value_type value_type;
2147 throw( numerical_exception( 1,
"Empty matrix." ) );
2154 case matrix_style::ge:
2158 integer n =
static_cast< integer
>( a.cols( ) );
2159 integer lda =
static_cast< integer
>( a.rows( ) );
2160 typename matrix< T, Allocator >::value_type dmy;
2167 char balanc[] =
"B";
2173 __clapack__::geevx( balanc, jobvl, jobvr, sense, n, NULL, lda, NULL, NULL, ldvl, NULL, ldvr, ilo, ihi, NULL, abnrm, NULL, NULL, &dmy, lwork, NULL, info );
2176 eigen_value.resize( n, 1 );
2177 eigen_vector.resize( n, n );
2178 value_type *scale =
new value_type[ n ];
2179 value_type *rwork =
new value_type[ 2 * n ];
2181 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2182 matrix< T, Allocator > work( lwork, 1 );
2183 __clapack__::geevx( balanc, jobvl, jobvr, sense, n, &( a[0] ), lda, &( eigen_value[0] ),
2184 NULL, ldvl, &( eigen_vector[0] ), ldvr, ilo, ihi, scale, abnrm, NULL, NULL, &( work[0] ), lwork, rwork, info );
2193 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2200 std::string val = __clapack__::to_string( info );
2201 std::string msg =
"U( " + val +
", " + val +
" ) is exactly zero. The factorization has been completed, but the factor U is exactly singular, so the solution and error bounds could not be computed. reciprocal condition number = 0 is returned.";
2202 throw( numerical_exception( info, msg ) );
2206 std::string msg =
"U is nonsingular, but reciprocal condition number (RCOND) is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest.";
2207 throw( numerical_exception( info, msg ) );
2214 return( eigen_value );
2226 template <
class T,
class Allocator >
2227 static matrix< T, Allocator >&
eigen( matrix< T, Allocator > &a, matrix< T, Allocator > &eigen_value, matrix< T, Allocator > &eigen_vector, matrix_style::style style )
2229 typedef __clapack__::integer integer;
2234 throw( numerical_exception( 1,
"Empty matrix." ) );
2241 case matrix_style::sy:
2244 integer n =
static_cast< integer
>( a.cols( ) );
2245 integer lda =
static_cast< integer
>( a.rows( ) );
2246 typename matrix< T, Allocator >::value_type dmy;
2252 __clapack__::syev( jobz, uplo, n, NULL, lda, NULL, &dmy, lwork, info );
2255 eigen_value.resize( n, 1 );
2258 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2259 matrix< T, Allocator > work( lwork, 1 );
2260 __clapack__::syev( jobz, uplo, n, &( eigen_vector[0] ), lda, &( eigen_value[0] ), &( work[0] ), lwork, info );
2266 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2271 throw( numerical_exception( info,
"The algorithm failed to converge. " + __clapack__::to_string( info ) +
"off-diagonal elements of an intermediate tridiagonal form did not converge to zero." ) );
2276 case matrix_style::ge:
2280 integer n =
static_cast< integer
>( a.cols( ) );
2281 integer lda =
static_cast< integer
>( a.rows( ) );
2282 typename matrix< T, Allocator >::value_type dmy;
2290 __clapack__::geev( jobvl, jobvr, n, NULL, lda, NULL, NULL, NULL, ldvl, NULL, ldvr, &dmy, lwork, info );
2293 eigen_value.resize( n, 1 );
2294 matrix< T, Allocator > tmp( n, 1 );
2295 eigen_vector.resize( n, n );
2297 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2298 matrix< T, Allocator > work( lwork, 1 );
2299 __clapack__::geev( jobvl, jobvr, n, &( a[0] ), lda, &( eigen_value[0] ), &( tmp[0] ),
2300 NULL, ldvl, &( eigen_vector[0] ), ldvr, &( work[0] ), lwork, info );
2306 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2311 throw( numerical_exception( info,
"QR algorithm failed to compute all the eigenvalues, and no eigenvectors have been computed." ) );
2320 throw( numerical_exception( info,
"Failed to compute the eigen values and vectors." ) );
2323 return( eigen_value );
2328 struct __eigen__< true >
2331 template <
class T,
class Allocator >
2332 static matrix< T, Allocator >&
eigen( matrix< T, Allocator > &a, matrix< T, Allocator > &eigen_value, matrix< T, Allocator > &eigen_vector, matrix_style::style style )
2334 typedef __clapack__::integer integer;
2335 typedef typename T::value_type value_type;
2340 throw( numerical_exception( 1,
"Empty matrix." ) );
2347 case matrix_style::ge:
2351 integer n =
static_cast< integer
>( a.cols( ) );
2352 integer lda =
static_cast< integer
>( a.rows( ) );
2353 typename matrix< T, Allocator >::value_type dmy;
2361 __clapack__::geev( jobvl, jobvr, n, NULL, lda, NULL, NULL, ldvl, NULL, ldvr, &dmy, lwork, NULL, info );
2364 eigen_value.resize( n, 1 );
2365 eigen_vector.resize( n, n );
2366 value_type *rwork =
new value_type[ 2 * n ];
2368 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2369 matrix< T, Allocator > work( lwork, 1 );
2370 __clapack__::geev( jobvl, jobvr, n, &( a[0] ), lda, &( eigen_value[0] ),
2371 NULL, ldvl, &( eigen_vector[0] ), ldvr, &( work[0] ), lwork, rwork, info );
2379 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2384 throw( numerical_exception( info,
"QR algorithm failed to compute all the eigenvalues, and no eigenvectors have been computed." ) );
2390 return( eigen_value );
2402 #if defined(_USE_DIVIDE_AND_CONQUER_SVD_) && _USE_DIVIDE_AND_CONQUER_SVD_ != 0
2409 template <
class T,
class Allocator >
2410 static matrix< T, Allocator >&
svd( matrix< T, Allocator > &a, matrix< T, Allocator > &u, matrix< T, Allocator > &s, matrix< T, Allocator > &vt, matrix_style::style style )
2412 typedef __clapack__::integer integer;
2413 typedef typename matrix< T, Allocator >::size_type size_type;
2418 throw( numerical_exception( 1,
"Empty matrix." ) );
2425 case matrix_style::ge:
2429 integer m =
static_cast< integer
>( a.rows( ) );
2430 integer n =
static_cast< integer
>( a.cols( ) );
2433 integer size = m < n ? m : n;
2434 typename matrix< T, Allocator >::value_type dmy;
2440 __clapack__::gesdd( jobz, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, info );
2444 matrix< T, Allocator > ss( size, 1 );
2445 vt.resize( ldvt, n );
2446 integer *iwork =
new integer[ 8 * size ];
2448 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2449 matrix< T, Allocator > work( lwork, 1 );
2450 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( ss[0] ), &( u[0] ), ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, iwork, info );
2455 for( size_type i = 0 ; i < ss.rows( ) ; i++ )
2457 s( i, i ) = ss[ i ];
2464 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2469 throw( numerical_exception( info,
"DBDSDC did not converge, updating process failed." ) );
2479 template <
class T,
class Allocator >
2480 static matrix< T, Allocator >&
svd( matrix< T, Allocator > &a, matrix< T, Allocator > &s, matrix< T, Allocator > &vt, matrix_style::style style )
2482 typedef __clapack__::integer integer;
2483 typedef typename matrix< T, Allocator >::size_type size_type;
2488 throw( numerical_exception( 1,
"Empty matrix." ) );
2495 case matrix_style::ge:
2499 integer m =
static_cast< integer
>( a.rows( ) );
2500 integer n =
static_cast< integer
>( a.cols( ) );
2503 integer size = m < n ? m : n;
2504 typename matrix< T, Allocator >::value_type dmy;
2510 __clapack__::gesdd( jobz, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, info );
2513 integer *iwork =
new integer[ 8 * size ];
2514 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2515 matrix< T, Allocator > work( lwork, 1 );
2516 s.resize( size, 1 );
2520 vt.resize( ldvt, n );
2521 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( s[0] ), NULL, ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, iwork, info );
2525 vt.resize( ldu, m );
2526 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( s[0] ), &( vt[0] ), ldu, NULL, ldvt, &( work[0] ), lwork, iwork, info );
2528 vt.resize( ldvt, n );
2530 for( integer r = 0 ; r < m ; r++ )
2532 for( size_type c = 0 ; c < vt.cols( ) ; c++ )
2534 vt( r, c ) = a( r, c );
2545 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2550 throw( numerical_exception( info,
"DBDSDC did not converge, updating process failed." ) );
2561 struct __svd__< true >
2564 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
2565 static matrix< T2, Allocator2 >&
svd( matrix< T1, Allocator1 > &a, matrix< T1, Allocator1 > &u, matrix< T2, Allocator2 > &s, matrix< T1, Allocator1 > &vt, matrix_style::style style )
2567 typedef __clapack__::integer integer;
2568 typedef typename matrix< T1, Allocator1 >::size_type size_type;
2569 typedef typename T1::value_type value_type;
2574 throw( numerical_exception( 1,
"Empty matrix." ) );
2581 case matrix_style::ge:
2585 integer m =
static_cast< integer
>( a.rows( ) );
2586 integer n =
static_cast< integer
>( a.cols( ) );
2589 integer size = m < n ? m : n;
2590 typename matrix< T1, Allocator1 >::value_type dmy;
2596 __clapack__::gesdd( jobz, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, NULL, info );
2600 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
2602 matrix< value_type > ss( size, 1 );
2604 matrix< value_type, typename Allocator1::template rebind< value_type >::other > ss( size, 1 );
2606 vt.resize( ldvt, n );
2607 value_type *rwork =
new value_type[ 5 * size * size + 5 * size ];
2608 integer *iwork =
new integer[ 8 * size ];
2610 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2611 matrix< T1, Allocator1 > work( lwork, 1 );
2612 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( ss[0] ), &( u[0] ), ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, rwork, iwork, info );
2618 for( size_type i = 0 ; i < ss.rows( ) ; i++ )
2620 s( i, i ) = ss[ i ];
2627 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2632 throw( numerical_exception( info,
"DBDSDC did not converge, updating process failed." ) );
2642 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
2643 static matrix< T2, Allocator2 >&
svd( matrix< T1, Allocator1 > &a, matrix< T2, Allocator2 > &s, matrix< T1, Allocator1 > &vt, matrix_style::style style )
2645 typedef __clapack__::integer integer;
2646 typedef typename matrix< T1, Allocator1 >::size_type size_type;
2647 typedef typename matrix< T1, Allocator1 >::value_type complex_type;
2648 typedef typename T1::value_type value_type;
2653 throw( numerical_exception( 1,
"Empty matrix." ) );
2660 case matrix_style::ge:
2664 integer m =
static_cast< integer
>( a.rows( ) );
2665 integer n =
static_cast< integer
>( a.cols( ) );
2668 integer size = m < n ? m : n;
2669 typename matrix< T1, Allocator1 >::value_type dmy;
2675 __clapack__::gesdd( jobz, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, NULL, info );
2678 value_type *rwork =
new value_type[ 5 * size * size + 5 * size ];
2679 integer *iwork =
new integer[ 8 * size ];
2681 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
2683 matrix< value_type > ss( size, 1 );
2685 matrix< value_type, typename Allocator1::template rebind< value_type >::other > ss( size, 1 );
2688 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2689 matrix< T1, Allocator1 > work( lwork, 1 );
2690 complex_type *dmy = NULL;
2694 vt.resize( ldvt, n );
2695 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( ss[0] ), NULL, ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, rwork, iwork, info );
2699 vt.resize( ldu, m );
2700 __clapack__::gesdd( jobz, m, n, &( a[0] ), lda, &( ss[0] ), &( vt[0] ), ldu, NULL, ldvt, &( work[0] ), lwork, rwork, iwork, info );
2702 vt.resize( ldvt, n );
2704 for( integer r = 0 ; r < m ; r++ )
2706 for( size_type c = 0 ; c < vt.cols( ) ; c++ )
2708 vt( r, c ) = a( r, c );
2716 s.resize( size, 1 );
2717 for( integer i = 0 ; i < size ; i++ )
2726 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2731 throw( numerical_exception( info,
"DBDSDC did not converge, updating process failed." ) );
2747 template <
class T,
class Allocator >
2748 static matrix< T, Allocator >&
svd( matrix< T, Allocator > &a, matrix< T, Allocator > &u, matrix< T, Allocator > &s, matrix< T, Allocator > &vt, matrix_style::style style )
2750 typedef __clapack__::integer integer;
2751 typedef typename matrix< T, Allocator >::size_type size_type;
2756 throw( numerical_exception( 1,
"Empty matrix." ) );
2763 case matrix_style::ge:
2767 integer m =
static_cast< integer
>( a.rows( ) );
2768 integer n =
static_cast< integer
>( a.cols( ) );
2771 typename matrix< T, Allocator >::value_type dmy;
2778 __clapack__::gesvd( jobu, jobvt, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, info );
2782 matrix< T, Allocator > ss( m < n ? m : n, 1 );
2783 vt.resize( ldvt, n );
2785 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2786 matrix< T, Allocator > work( lwork, 1 );
2787 __clapack__::gesvd( jobu, jobvt, m, n, &( a[0] ), lda, &( ss[0] ), &( u[0] ), ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, info );
2790 for( size_type i = 0 ; i < ss.rows( ) ; i++ )
2792 s( i, i ) = ss[ i ];
2799 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2804 throw( numerical_exception( info,
"DBDSQR did not converge, INFO specifies how many superdiagonals of an intermediate bidiagonal form B did not converge to zero. See the description of WORK above for details." ) );
2814 template <
class T,
class Allocator >
2815 static matrix< T, Allocator >&
svd( matrix< T, Allocator > &a, matrix< T, Allocator > &s, matrix< T, Allocator > &vt, matrix_style::style style )
2817 typedef __clapack__::integer integer;
2818 typedef typename matrix< T, Allocator >::size_type size_type;
2823 throw( numerical_exception( 1,
"Empty matrix." ) );
2830 case matrix_style::ge:
2834 integer m =
static_cast< integer
>( a.rows( ) );
2835 integer n =
static_cast< integer
>( a.cols( ) );
2838 typename matrix< T, Allocator >::value_type dmy;
2845 __clapack__::gesvd( jobu, jobvt, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, info );
2848 s.resize( m < n ? m : n, 1 );
2849 vt.resize( ldvt, n );
2851 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2852 matrix< T, Allocator > work( lwork, 1 );
2853 __clapack__::gesvd( jobu, jobvt, m, n, &( a[0] ), lda, &( s[0] ), NULL, ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, info );
2859 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2864 throw( numerical_exception( info,
"DBDSQR did not converge, INFO specifies how many superdiagonals of an intermediate bidiagonal form B did not converge to zero. See the description of WORK above for details." ) );
2875 struct __svd__< true >
2878 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
2879 static matrix< T2, Allocator2 >&
svd( matrix< T1, Allocator1 > &a, matrix< T1, Allocator1 > &u, matrix< T2, Allocator2 > &s, matrix< T1, Allocator1 > &vt, matrix_style::style style )
2881 typedef __clapack__::integer integer;
2882 typedef typename matrix< T1, Allocator1 >::size_type size_type;
2883 typedef typename T1::value_type value_type;
2888 throw( numerical_exception( 1,
"Empty matrix." ) );
2895 case matrix_style::ge:
2899 integer m =
static_cast< integer
>( a.rows( ) );
2900 integer n =
static_cast< integer
>( a.cols( ) );
2903 integer size = m < n ? m : n;
2904 typename matrix< T1, Allocator1 >::value_type dmy;
2911 __clapack__::gesvd( jobu, jobvt, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, info );
2915 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
2917 matrix< value_type > ss( size, 1 );
2919 matrix< value_type, typename Allocator1::template rebind< value_type >::other > ss( size, 1 );
2921 vt.resize( ldvt, n );
2922 value_type *rwork =
new value_type[ 5 * size ];
2924 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
2925 matrix< T1, Allocator1 > work( lwork, 1 );
2926 __clapack__::gesvd( jobu, jobvt, m, n, &( a[0] ), lda, &( ss[0] ), &( u[0] ), ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, rwork, info );
2929 for( size_type i = 0 ; i < ss.rows( ) ; i++ )
2931 s( i, i ) = ss[ i ];
2940 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
2945 throw( numerical_exception( info,
"ZBDSQR did not converge, INFO specifies how many superdiagonals of an intermediate bidiagonal form B did not converge to zero. See the description of WORK above for details." ) );
2955 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
2956 static matrix< T2, Allocator2 >&
svd( matrix< T1, Allocator1 > &a, matrix< T2, Allocator2 > &s, matrix< T1, Allocator1 > &vt, matrix_style::style style )
2958 typedef __clapack__::integer integer;
2959 typedef typename matrix< T1, Allocator1 >::size_type size_type;
2960 typedef typename T1::value_type value_type;
2965 throw( numerical_exception( 1,
"Empty matrix." ) );
2972 case matrix_style::ge:
2976 integer m =
static_cast< integer
>( a.rows( ) );
2977 integer n =
static_cast< integer
>( a.cols( ) );
2980 integer size = m < n ? m : n;
2981 typename matrix< T1, Allocator1 >::value_type dmy;
2988 __clapack__::gesvd( jobu, jobvt, m, n, NULL, lda, NULL, NULL, ldu, NULL, ldvt, &dmy, lwork, NULL, info );
2991 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
2993 s.resize( size, 1 );
2995 matrix< value_type, typename Allocator1::template rebind< value_type >::other > ss( size, 1 );
2997 vt.resize( ldvt, n );
2998 value_type *rwork =
new value_type[ 5 * size ];
3000 lwork =
static_cast< integer
>( __clapack__::get_real( dmy ) );
3001 matrix< T1, Allocator1 > work( lwork, 1 );
3002 __clapack__::gesvd( jobu, jobvt, m, n, &( a[0] ), lda, &( s[0] ), NULL, ldu, &( vt[0] ), ldvt, &( work[0] ), lwork, rwork, info );
3010 throw( numerical_exception( info, __clapack__::to_string( info ) +
"-th argument had an illegal value" ) );
3015 throw( numerical_exception( info,
"ZBDSQR did not converge, INFO specifies how many superdiagonals of an intermediate bidiagonal form B did not converge to zero. See the description of WORK above for details." ) );
3049 template <
class T,
class Allocator >
3050 inline bool multiply(
const matrix< T, Allocator > &a,
const matrix< T, Allocator > &b,
matrix< T, Allocator > &c,
bool a_is_transpose,
bool b_is_transpose,
typename matrix< T, Allocator >::value_type alpha,
typename matrix< T, Allocator >::value_type beta )
3052 typedef __clapack__::integer integer;
3062 integer m =
static_cast< integer
>( a_is_transpose ? a.
cols( ) : a.
rows( ) );
3063 integer n =
static_cast< integer
>( b_is_transpose ? b.
rows( ) : b.
cols( ) );
3064 integer k =
static_cast< integer
>( a_is_transpose ? a.
rows( ) : a.
cols( ) );
3065 integer k_ =
static_cast< integer
>( b_is_transpose ? b.
cols( ) : b.
rows( ) );
3066 integer lda = a_is_transpose ? k : m;
3067 integer ldb = b_is_transpose ? n : k;
3078 transa[ 0 ] = a_is_transpose ?
'T' :
'N';
3080 transb[ 0 ] = b_is_transpose ?
'T' :
'N';
3088 __clapack__::gemm( transa, transb, m, n, k, alpha, const_cast< value_type * >( &( a[ 0 ] ) ), lda, const_cast< value_type * >( &( b[ 0 ] ) ), ldb, beta, &( c[ 0 ] ), ldc );
3107 template <
class T,
class Allocator >
3110 return(
multiply( a, b, c, a_is_transpose, b_is_transpose, 1, 0 ) );
3122 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
3130 for( i = 0 ; i < pivot.
size( ) ; i++ )
3132 p[ i ] =
static_cast< value_type
>( i );
3136 for( i = 0 ; i < pivot.
size( ) ; i++ )
3138 value_type tmp = p[ i ];
3139 p[ i ] = p[ pivot[ i ] - 1 ];
3140 p[ pivot[ i ] - 1 ] = tmp;
3147 for( i = 0 ; i < pivot.
size( ) ; i++ )
3149 out( p[ i ], i ) = 1;
3162 template <
class T,
class Allocator >
3167 value_type v = value_type( 0 );
3169 for( size_type i = 0 ; i < size ; ++i )
3208 template <
class T,
class Allocator >
3216 return( value_type( 0 ) );
3222 return( a( 0, 0 ) );
3226 return( a( 0, 0 ) * a( 1, 1 ) - a( 0, 1 ) * a( 1, 0 ) );
3230 return( a( 0, 0 ) * a( 1, 1 ) * a( 2, 2 ) + a( 0, 1 ) * a( 1, 2 ) * a( 2, 0 ) + a( 0, 2 ) * a( 1, 0 ) * a( 2, 1 )
3231 - a( 0, 2 ) * a( 1, 1 ) * a( 2, 0 ) - a( 0, 1 ) * a( 1, 0 ) * a( 2, 2 ) - a( 0, 0 ) * a( 1, 2 ) * a( 2, 1 ) );
3236 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
3247 value_type v = m( 0, 0 );
3249 size_type count = 0, i;
3252 for( i = 0 ; i < pivot.
size( ) ; ++i )
3254 count +=
static_cast< size_type
>( pivot[ i ] ) != i + 1 ? 1 : 0;
3258 for( i = 1 ; i < size ; ++i )
3263 if( count % 2 == 0 )
3272 catch(
const numerical_exception &e )
3301 template <
class T,
class Allocator >
3307 return( __solve__::__solve__< __numeric__::is_complex< T >::value >::solve( a_, b, style ) );
3309 catch(
const numerical_exception &e )
3350 template <
class T,
class Allocator1,
class Allocator2 >
3356 return( __lu__::__lu__< __numeric__::is_complex< T >::value >::
lu_factorization( a_, pivot, style ) );
3358 catch(
const numerical_exception &e )
3377 template <
class T,
class Allocator >
3380 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
3390 __lu__::__lu__< __numeric__::is_complex< T >::value >
::lu_factorization( L, piv, style );
3395 for( size_type r = 0 ; r < a.
rows( ) ; r++ )
3397 for( size_type c = r ; c < a.
cols( ) ; c++ )
3399 U( r, c ) = L( r, c );
3407 catch(
const numerical_exception &e )
3423 template <
class T,
class Allocator >
3426 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
3436 return( __lu__::__lu__< __numeric__::is_complex< T >::value >::
lu_factorization( a_, pivot, style ) );
3438 catch(
const numerical_exception &e )
3453 template <
class T,
class Allocator >
3459 return( __cholesky__::cholesky_factorization( a_, style ) );
3461 catch(
const numerical_exception &e )
3478 template <
class T,
class Allocator >
3484 __qr__::__qr__< __numeric__::is_complex< T >::value >
::qr_factorization( a_, Q, R, style );
3486 catch(
const numerical_exception &e )
3505 template <
class T,
class Allocator >
3509 typedef typename matrix_type::size_type size_type;
3516 matrix_type u, s, vt;
3517 svd( a, u, s, vt, style );
3518 size_type num = s.rows( ) < s.cols( ) ? s.rows( ) : s.cols( );
3519 for( size_type i = 0 ; i < num ; i++ )
3521 if( __clapack__::get_real( s( i, i ) ) != 0 )
3523 s( i, i ) = 1 / __clapack__::get_real( s( i, i ) );
3526 return( ( u * s * vt ).t( ) );
3530 matrix_type a_( a );
3531 return( __inverse__::__inverse__< __numeric__::is_complex< T >::value >::
inverse( a_, style ) );
3534 catch(
const numerical_exception &e )
3555 template <
class T,
class Allocator >
3564 __eigen__::__eigen__< __numeric__::is_complex< T >::value >
::eigen( a_, eigen_value, eigen_vector, style );
3566 catch(
const numerical_exception &e )
3571 typedef __clapack__::__value_index_pair__< T > value_index_pair;
3573 std::vector< value_index_pair > vips( eigen_value.
size( ) );
3575 for( size_type i = 0 ; i < eigen_value.
size( ) ; i++ )
3577 value_index_pair &vi = vips[ i ];
3578 vi.value = eigen_value[ i ];
3583 #if defined( _DESCENDING_ORDER_EIGEN_VALUE_ ) && _DESCENDING_ORDER_EIGEN_VALUE_ == 1
3585 std::sort( vips.begin( ), vips.end( ), value_index_pair::descending );
3588 std::sort( vips.begin( ), vips.end( ), value_index_pair::ascending );
3593 for( size_type i = 0 ; i < vips.size( ) ; i++ )
3595 const value_index_pair &vi = vips[ i ];
3596 eigen_value[ i ] = vi.value;
3598 for( size_type j = 0 ; j < eigen_vector.
rows( ) ; j++ )
3600 eigen_vector( j, i ) = a_( j, vi.index );
3604 return( eigen_value );
3622 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
3628 return( __svd__::__svd__< __numeric__::is_complex< T1 >::value >::
svd( a_, u, s, vt, style ) );
3630 catch(
const numerical_exception &e )
3652 template <
class T1,
class T2,
class Allocator1,
class Allocator2 >
3658 return( __svd__::__svd__< __numeric__::is_complex< T1 >::value >::
svd( a_, s, vt, style ) );
3660 catch(
const numerical_exception &e )
3675 #endif // __INCLUDE_NUMERIC__