From 390724b4b66aa950cde7e0e7d0e70de05a924169 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Fri, 18 Feb 2011 11:25:04 +0100 Subject: add lapack interface to real symmetric eigenvalue dec and enable building of the lapack shared library --- lapack/CMakeLists.txt | 9 ++--- lapack/double.cpp | 1 + lapack/eigenvalues.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ lapack/single.cpp | 1 + 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 lapack/eigenvalues.cpp (limited to 'lapack') diff --git a/lapack/CMakeLists.txt b/lapack/CMakeLists.txt index 2d5db5d1d..96d6a416d 100644 --- a/lapack/CMakeLists.txt +++ b/lapack/CMakeLists.txt @@ -29,6 +29,7 @@ set(EigenLapack_SRCS ${EigenLapack_SRCS} # reference/dpotrs.f reference/spotrs.f reference/zpotrs.f reference/cpotrs.f # reference/dgetrf.f reference/cgetrf.f reference/sgetrf.f reference/zgetrf.f # reference/cgetrs.f reference/dgetrs.f reference/sgetrs.f reference/zgetrs.f +# reference/dsyev.f reference/ssyev.f reference/dlamch.f reference/ilaver.f reference/lsame.f reference/slamch.f reference/second_NONE.f reference/dsecnd_NONE.f reference/cbdsqr.f reference/ctbrfs.f reference/dorml2.f reference/sla_porfsx_extended.f reference/zggglm.f @@ -124,7 +125,7 @@ reference/cheevr.f reference/dgehd2.f reference/dste reference/cheevx.f reference/dgehrd.f reference/dsycon.f reference/sopgtr.f reference/zlagtm.f reference/chegs2.f reference/dgejsv.f reference/dsyequb.f reference/sopmtr.f reference/zla_heamv.f reference/chegst.f reference/dgelq2.f reference/dsyevd.f reference/sorg2l.f reference/zlahef.f -reference/chegvd.f reference/dgelqf.f reference/dsyev.f reference/sorg2r.f reference/zla_hercond_c.f +reference/chegvd.f reference/dgelqf.f reference/sorg2r.f reference/zla_hercond_c.f reference/chegv.f reference/dgelsd.f reference/dsyevr.f reference/sorgbr.f reference/zla_hercond_x.f reference/chegvx.f reference/dgels.f reference/dsyevx.f reference/sorghr.f reference/zla_herfsx_extended.f reference/cherfs.f reference/dgelss.f reference/dsygs2.f reference/sorgl2.f reference/zla_herpvgrw.f @@ -230,7 +231,7 @@ reference/claqhp.f reference/dlamrg.f reference/sgee reference/claqp2.f reference/dlaneg.f reference/sgegs.f reference/ssycon.f reference/zpftri.f reference/claqps.f reference/dlangb.f reference/sgegv.f reference/ssyequb.f reference/zpftrs.f reference/claqr0.f reference/dlange.f reference/sgehd2.f reference/ssyevd.f reference/zpocon.f -reference/claqr1.f reference/dlangt.f reference/sgehrd.f reference/ssyev.f reference/zpoequb.f +reference/claqr1.f reference/dlangt.f reference/sgehrd.f reference/zpoequb.f reference/claqr2.f reference/dlanhs.f reference/sgejsv.f reference/ssyevr.f reference/zpoequ.f reference/claqr3.f reference/dlansb.f reference/sgelq2.f reference/ssyevx.f reference/zporfs.f reference/claqr4.f reference/dlansf.f reference/sgelqf.f reference/ssygs2.f reference/zporfsx.f @@ -357,11 +358,11 @@ reference/ctbcon.f reference/dormhr.f reference/sla_ endif() add_library(eigen_lapack_static ${EigenLapack_SRCS}) -# add_library(eigen_lapack SHARED ${EigenLapack_SRCS}) +add_library(eigen_lapack SHARED ${EigenLapack_SRCS}) if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO) target_link_libraries(eigen_lapack_static ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) -# target_link_libraries(eigen_lapack ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) + target_link_libraries(eigen_lapack ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO}) endif() # add_dependencies(lapack eigen_lapack eigen_lapack_static) diff --git a/lapack/double.cpp b/lapack/double.cpp index 5f7b9d15d..44723573c 100644 --- a/lapack/double.cpp +++ b/lapack/double.cpp @@ -29,3 +29,4 @@ #include "cholesky.cpp" #include "lu.cpp" +#include "eigenvalues.cpp" diff --git a/lapack/eigenvalues.cpp b/lapack/eigenvalues.cpp new file mode 100644 index 000000000..0bc8367db --- /dev/null +++ b/lapack/eigenvalues.cpp @@ -0,0 +1,93 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2011 Gael Guennebaud +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see . + +#include "common.h" +#include + +// computes an LU factorization of a general M-by-N matrix A using partial pivoting with row interchanges +EIGEN_LAPACK_FUNC(syev,(char *jobz, char *uplo, int* n, Scalar* a, int *lda, Scalar* w, Scalar* work, int* lwork, int *info)) +{ + bool query_size = *lwork==-1; + + *info = 0; + if(*jobz!='N' && *jobz!='V') *info = -1; + else if(UPLO(*uplo)==INVALID) *info = -2; + else if(*n<0) *info = -3; + else if(*lda eig(mat,computeVectors?ComputeEigenvectors:EigenvaluesOnly); + + if(eig.info()==NoConvergence) + { + vector(w,*n).setZero(); + if(computeVectors) + matrix(a,*n,*n,*lda).setIdentity(); + //*info = 1; + return 0; + } + + vector(w,*n) = eig.eigenvalues(); + if(computeVectors) + matrix(a,*n,*n,*lda) = eig.eigenvectors(); + + return 0; +} diff --git a/lapack/single.cpp b/lapack/single.cpp index 141b65538..49c72f5ec 100644 --- a/lapack/single.cpp +++ b/lapack/single.cpp @@ -29,3 +29,4 @@ #include "cholesky.cpp" #include "lu.cpp" +#include "eigenvalues.cpp" -- cgit v1.2.3