10#include "lapack_common.h"
14EIGEN_LAPACK_FUNC(gesdd,(
char *jobz,
int *m,
int* n, Scalar* a,
int *lda, RealScalar *s, Scalar *u,
int *ldu, Scalar *vt,
int *ldvt, Scalar* ,
int* lwork,
15 EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar *)
int * ,
int *info))
18 bool query_size = *lwork==-1;
19 int diag_size = (std::min)(*m,*n);
22 if(*jobz!=
'A' && *jobz!=
'S' && *jobz!=
'O' && *jobz!=
'N') *info = -1;
23 else if(*m<0) *info = -2;
24 else if(*n<0) *info = -3;
25 else if(*lda<std::max(1,*m)) *info = -5;
26 else if(*lda<std::max(1,*m)) *info = -8;
27 else if(*ldu <1 || (*jobz==
'A' && *ldu <*m)
28 || (*jobz==
'O' && *m<*n && *ldu<*m)) *info = -8;
29 else if(*ldvt<1 || (*jobz==
'A' && *ldvt<*n)
30 || (*jobz==
'S' && *ldvt<diag_size)
31 || (*jobz==
'O' && *m>=*n && *ldvt<*n)) *info = -10;
36 return xerbla_(SCALAR_SUFFIX_UP
"GESDD ", &e, 6);
49 mat = matrix(a,*m,*n,*lda);
58 make_vector(s,diag_size) = svd.singularValues().head(diag_size);
62 matrix(u,*m,*m,*ldu) = svd.matrixU();
63 matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint();
67 matrix(u,*m,diag_size,*ldu) = svd.matrixU();
68 matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint();
70 else if(*jobz==
'O' && *m>=*n)
72 matrix(a,*m,*n,*lda) = svd.matrixU();
73 matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint();
77 matrix(u,*m,*m,*ldu) = svd.matrixU();
78 matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint();
85EIGEN_LAPACK_FUNC(gesvd,(
char *jobu,
char *jobv,
int *m,
int* n, Scalar* a,
int *lda, RealScalar *s, Scalar *u,
int *ldu, Scalar *vt,
int *ldvt, Scalar* ,
int* lwork,
86 EIGEN_LAPACK_ARG_IF_COMPLEX(RealScalar *)
int *info))
89 bool query_size = *lwork==-1;
90 int diag_size = (std::min)(*m,*n);
93 if( *jobu!=
'A' && *jobu!=
'S' && *jobu!=
'O' && *jobu!=
'N') *info = -1;
94 else if((*jobv!=
'A' && *jobv!=
'S' && *jobv!=
'O' && *jobv!=
'N')
95 || (*jobu==
'O' && *jobv==
'O')) *info = -2;
96 else if(*m<0) *info = -3;
97 else if(*n<0) *info = -4;
98 else if(*lda<std::max(1,*m)) *info = -6;
99 else if(*ldu <1 || ((*jobu==
'A' || *jobu==
'S') && *ldu<*m)) *info = -9;
100 else if(*ldvt<1 || (*jobv==
'A' && *ldvt<*n)
101 || (*jobv==
'S' && *ldvt<diag_size)) *info = -11;
106 return xerbla_(SCALAR_SUFFIX_UP
"GESVD ", &e, 6);
119 mat = matrix(a,*m,*n,*lda);
126 make_vector(s,diag_size) = svd.singularValues().head(diag_size);
128 if(*jobu==
'A') matrix(u,*m,*m,*ldu) = svd.matrixU();
129 else if(*jobu==
'S') matrix(u,*m,diag_size,*ldu) = svd.matrixU();
130 else if(*jobu==
'O') matrix(a,*m,diag_size,*lda) = svd.matrixU();
133 if(*jobv==
'A') matrix(vt,*n,*n,*ldvt) = svd.matrixV().adjoint();
134 else if(*jobv==
'S') matrix(vt,diag_size,*n,*ldvt) = svd.matrixV().adjoint();
135 else if(*jobv==
'O') matrix(a,diag_size,*n,*lda) = svd.matrixV().adjoint();
class Bidiagonal Divide and Conquer SVD
Definition BDCSVD.h:78
Two-sided Jacobi SVD decomposition of a rectangular matrix.
Definition JacobiSVD.h:490
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
@ ComputeFullV
Definition Constants.h:397
@ ComputeThinV
Definition Constants.h:399
@ ComputeFullU
Definition Constants.h:393
@ ComputeThinU
Definition Constants.h:395