mirror of https://github.com/CGAL/cgal
Merge pull request #1720 from sgiraudot/Solver_interface-Enhance_eigen_diagonalize-GF
Use faster Eigen implementation for diagonalization
This commit is contained in:
commit
8dab03e8e9
|
|
@ -24,6 +24,17 @@
|
||||||
#include <Eigen/Dense>
|
#include <Eigen/Dense>
|
||||||
#include <Eigen/Eigenvalues>
|
#include <Eigen/Eigenvalues>
|
||||||
|
|
||||||
|
|
||||||
|
// If the matrix to diagonalize is of dimension 2x2 or 3x3, Eigen
|
||||||
|
// provides a faster implementation using a closed-form
|
||||||
|
// algorithm. However, it offers less precision. See:
|
||||||
|
// https://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html
|
||||||
|
// This is usually acceptable for CGAL algorithms but one might want
|
||||||
|
// to use the slower but more accurate version. In that case, just
|
||||||
|
// uncomment the following line:
|
||||||
|
|
||||||
|
//#define DO_NOT_USE_EIGEN_COMPUTEDIRECT_FOR_DIAGONALIZATION
|
||||||
|
|
||||||
#include <CGAL/array.h>
|
#include <CGAL/array.h>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
@ -67,7 +78,14 @@ private:
|
||||||
diagonalize_selfadjoint_matrix (EigenMatrix& m,
|
diagonalize_selfadjoint_matrix (EigenMatrix& m,
|
||||||
EigenMatrix& eigenvectors,
|
EigenMatrix& eigenvectors,
|
||||||
EigenVector& eigenvalues) {
|
EigenVector& eigenvalues) {
|
||||||
Eigen::SelfAdjointEigenSolver<EigenMatrix> eigensolver(m);
|
Eigen::SelfAdjointEigenSolver<EigenMatrix> eigensolver;
|
||||||
|
|
||||||
|
#ifndef DO_NOT_USE_EIGEN_COMPUTEDIRECT_FOR_DIAGONALIZATION
|
||||||
|
if (dim == 2 || dim == 3)
|
||||||
|
eigensolver.computeDirect(m);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
eigensolver.compute(m);
|
||||||
|
|
||||||
if (eigensolver.info() != Eigen::Success) {
|
if (eigensolver.info() != Eigen::Success) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue