mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-14 00:51:52 +08:00
Automatically switch between EigenSolver and ComplexEigenSolver, and fix a few Real versus Scalar issues.
(grafted from 56e5ec07c6846585a8d808cab15a0aa5f6cd0cc8 )
This commit is contained in:
parent
4415d4e2d4
commit
222ce4b49d
@ -99,7 +99,7 @@ class PolynomialSolverBase
|
|||||||
*/
|
*/
|
||||||
inline const RootType& greatestRoot() const
|
inline const RootType& greatestRoot() const
|
||||||
{
|
{
|
||||||
std::greater<Scalar> greater;
|
std::greater<RealScalar> greater;
|
||||||
return selectComplexRoot_withRespectToNorm( greater );
|
return selectComplexRoot_withRespectToNorm( greater );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ class PolynomialSolverBase
|
|||||||
*/
|
*/
|
||||||
inline const RootType& smallestRoot() const
|
inline const RootType& smallestRoot() const
|
||||||
{
|
{
|
||||||
std::less<Scalar> less;
|
std::less<RealScalar> less;
|
||||||
return selectComplexRoot_withRespectToNorm( less );
|
return selectComplexRoot_withRespectToNorm( less );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ class PolynomialSolverBase
|
|||||||
bool& hasArealRoot,
|
bool& hasArealRoot,
|
||||||
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
||||||
{
|
{
|
||||||
std::greater<Scalar> greater;
|
std::greater<RealScalar> greater;
|
||||||
return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold );
|
return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ class PolynomialSolverBase
|
|||||||
bool& hasArealRoot,
|
bool& hasArealRoot,
|
||||||
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
||||||
{
|
{
|
||||||
std::less<Scalar> less;
|
std::less<RealScalar> less;
|
||||||
return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold );
|
return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ class PolynomialSolverBase
|
|||||||
bool& hasArealRoot,
|
bool& hasArealRoot,
|
||||||
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
||||||
{
|
{
|
||||||
std::greater<Scalar> greater;
|
std::greater<RealScalar> greater;
|
||||||
return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold );
|
return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +282,7 @@ class PolynomialSolverBase
|
|||||||
bool& hasArealRoot,
|
bool& hasArealRoot,
|
||||||
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
|
||||||
{
|
{
|
||||||
std::less<Scalar> less;
|
std::less<RealScalar> less;
|
||||||
return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold );
|
return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ class PolynomialSolverBase
|
|||||||
* However, almost always, correct accuracy is reached even in these cases for 64bit
|
* However, almost always, correct accuracy is reached even in these cases for 64bit
|
||||||
* (double) floating types and small polynomial degree (<20).
|
* (double) floating types and small polynomial degree (<20).
|
||||||
*/
|
*/
|
||||||
template< typename _Scalar, int _Deg , typename EigenSolverType = EigenSolver<Matrix<_Scalar,_Deg,_Deg> > >
|
template<typename _Scalar, int _Deg>
|
||||||
class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>
|
class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -337,7 +337,9 @@ class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>
|
|||||||
EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
|
EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
|
||||||
|
|
||||||
typedef Matrix<Scalar,_Deg,_Deg> CompanionMatrixType;
|
typedef Matrix<Scalar,_Deg,_Deg> CompanionMatrixType;
|
||||||
//typedef EigenSolver<CompanionMatrixType> EigenSolverType;
|
typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
|
||||||
|
ComplexEigenSolver<CompanionMatrixType>,
|
||||||
|
EigenSolver<CompanionMatrixType> >::type EigenSolverType;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Computes the complex roots of a new polynomial. */
|
/** Computes the complex roots of a new polynomial. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user