Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "common.h"
00026 #include <Eigen/Eigenvalues>
00027
00028
00029 EIGEN_LAPACK_FUNC(syev,(char *jobz, char *uplo, int* n, Scalar* a, int *lda, Scalar* w, Scalar* , int* lwork, int *info))
00030 {
00031
00032 bool query_size = *lwork==-1;
00033
00034 *info = 0;
00035 if(*jobz!='N' && *jobz!='V') *info = -1;
00036 else if(UPLO(*uplo)==INVALID) *info = -2;
00037 else if(*n<0) *info = -3;
00038 else if(*lda<std::max(1,*n)) *info = -5;
00039 else if((!query_size) && *lwork<std::max(1,3**n-1)) *info = -8;
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 if(*info!=0)
00059 {
00060 int e = -*info;
00061 return xerbla_(SCALAR_SUFFIX_UP"SYEV ", &e, 6);
00062 }
00063
00064 if(query_size)
00065 {
00066 *lwork = 0;
00067 return 0;
00068 }
00069
00070 if(*n==0)
00071 return 0;
00072
00073 PlainMatrixType mat(*n,*n);
00074 if(UPLO(*uplo)==UP) mat = matrix(a,*n,*n,*lda).adjoint();
00075 else mat = matrix(a,*n,*n,*lda);
00076
00077 bool computeVectors = *jobz=='V' || *jobz=='v';
00078 SelfAdjointEigenSolver<PlainMatrixType> eig(mat,computeVectors?ComputeEigenvectors:EigenvaluesOnly);
00079
00080 if(eig.info()==NoConvergence)
00081 {
00082 vector(w,*n).setZero();
00083 if(computeVectors)
00084 matrix(a,*n,*n,*lda).setIdentity();
00085
00086 return 0;
00087 }
00088
00089 vector(w,*n) = eig.eigenvalues();
00090 if(computeVectors)
00091 matrix(a,*n,*n,*lda) = eig.eigenvectors();
00092
00093 return 0;
00094 }