mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 00:03:03 +04:00
Use Eigen::SelfAdjointEigenSolver in cv::eigen
This commit is contained in:
committed by
Alexander Alekhin
parent
a3ec2ac3c5
commit
611cf8d86f
@@ -43,6 +43,12 @@
|
||||
#include "precomp.hpp"
|
||||
#include <limits>
|
||||
|
||||
#ifdef HAVE_EIGEN
|
||||
#include <Eigen/Core>
|
||||
#include <Eigen/Eigenvalues>
|
||||
#include "opencv2/core/eigen.hpp"
|
||||
#endif
|
||||
|
||||
#if defined _M_IX86 && defined _MSC_VER && _MSC_VER < 1700
|
||||
#pragma float_control(precise, on)
|
||||
#endif
|
||||
@@ -1396,6 +1402,47 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
|
||||
v = _evects.getMat();
|
||||
}
|
||||
|
||||
#ifdef HAVE_EIGEN
|
||||
const bool evecNeeded = _evects.needed();
|
||||
const int esOptions = evecNeeded ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly;
|
||||
_evals.create(n, 1, type);
|
||||
cv::Mat evals = _evals.getMat();
|
||||
if ( type == CV_64F )
|
||||
{
|
||||
Eigen::MatrixXd src_eig, zeros_eig;
|
||||
cv::cv2eigen(src, src_eig);
|
||||
|
||||
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es;
|
||||
es.compute(src_eig, esOptions);
|
||||
if ( es.info() == Eigen::Success )
|
||||
{
|
||||
cv::eigen2cv(es.eigenvalues().reverse().eval(), evals);
|
||||
if ( evecNeeded )
|
||||
{
|
||||
cv::Mat evects = _evects.getMat();
|
||||
cv::eigen2cv(es.eigenvectors().rowwise().reverse().transpose().eval(), v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} else { // CV_32F
|
||||
Eigen::MatrixXf src_eig, zeros_eig;
|
||||
cv::cv2eigen(src, src_eig);
|
||||
|
||||
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> es;
|
||||
es.compute(src_eig, esOptions);
|
||||
if ( es.info() == Eigen::Success )
|
||||
{
|
||||
cv::eigen2cv(es.eigenvalues().reverse().eval(), evals);
|
||||
if ( evecNeeded )
|
||||
{
|
||||
cv::eigen2cv(es.eigenvectors().rowwise().reverse().transpose().eval(), v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
#else
|
||||
|
||||
size_t elemSize = src.elemSize(), astep = alignSize(n*elemSize, 16);
|
||||
AutoBuffer<uchar> buf(n*astep + n*5*elemSize + 32);
|
||||
uchar* ptr = alignPtr((uchar*)buf, 16);
|
||||
@@ -1408,6 +1455,7 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
|
||||
|
||||
w.copyTo(_evals);
|
||||
return ok;
|
||||
#endif
|
||||
}
|
||||
|
||||
namespace cv
|
||||
|
||||
Reference in New Issue
Block a user