mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-26 06:44:27 +08:00
Enforce scalar types in calls to max/min (helps with expression template scalar types)
This commit is contained in:
parent
b118bc76eb
commit
1b2049fbda
@ -304,7 +304,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|||||||
{
|
{
|
||||||
m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
|
m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
|
||||||
// keep track of the largest diagonal coefficient
|
// keep track of the largest diagonal coefficient
|
||||||
maxDiagEntry = numext::maxi(maxDiagEntry,abs(m_matT.coeffRef(iu,iu)));
|
maxDiagEntry = numext::maxi<Scalar>(maxDiagEntry,abs(m_matT.coeffRef(iu,iu)));
|
||||||
if (iu > 0)
|
if (iu > 0)
|
||||||
m_matT.coeffRef(iu, iu-1) = Scalar(0);
|
m_matT.coeffRef(iu, iu-1) = Scalar(0);
|
||||||
iu--;
|
iu--;
|
||||||
@ -314,7 +314,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|||||||
{
|
{
|
||||||
splitOffTwoRows(iu, computeU, exshift);
|
splitOffTwoRows(iu, computeU, exshift);
|
||||||
// keep track of the largest diagonal coefficient
|
// keep track of the largest diagonal coefficient
|
||||||
maxDiagEntry = numext::maxi(maxDiagEntry,numext::maxi(abs(m_matT.coeff(iu,iu)), abs(m_matT.coeff(iu-1,iu-1))));
|
maxDiagEntry = numext::maxi<Scalar>(maxDiagEntry,numext::maxi(abs(m_matT.coeff(iu,iu)), abs(m_matT.coeff(iu-1,iu-1))));
|
||||||
iu -= 2;
|
iu -= 2;
|
||||||
iter = 0;
|
iter = 0;
|
||||||
}
|
}
|
||||||
|
@ -1052,7 +1052,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
|
|||||||
|
|
||||||
const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
|
const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
|
||||||
RealScalar maxDiag = diag.tail((std::max)(Index(1),length-1)).cwiseAbs().maxCoeff();
|
RealScalar maxDiag = diag.tail((std::max)(Index(1),length-1)).cwiseAbs().maxCoeff();
|
||||||
RealScalar epsilon_strict = numext::maxi(considerZero,NumTraits<RealScalar>::epsilon() * maxDiag);
|
RealScalar epsilon_strict = numext::maxi<RealScalar>(considerZero,NumTraits<RealScalar>::epsilon() * maxDiag);
|
||||||
RealScalar epsilon_coarse = 8 * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(col0.cwiseAbs().maxCoeff(), maxDiag);
|
RealScalar epsilon_coarse = 8 * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(col0.cwiseAbs().maxCoeff(), maxDiag);
|
||||||
|
|
||||||
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
||||||
|
@ -727,7 +727,7 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
|
|||||||
if(computeV()) m_matrixV.applyOnTheRight(p,q,j_right);
|
if(computeV()) m_matrixV.applyOnTheRight(p,q,j_right);
|
||||||
|
|
||||||
// keep track of the largest diagonal coefficient
|
// keep track of the largest diagonal coefficient
|
||||||
maxDiagEntry = numext::maxi(maxDiagEntry,numext::maxi(abs(m_workMatrix.coeff(p,p)), abs(m_workMatrix.coeff(q,q))));
|
maxDiagEntry = numext::maxi<RealScalar>(maxDiagEntry,numext::maxi(abs(m_workMatrix.coeff(p,p)), abs(m_workMatrix.coeff(q,q))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,10 +130,9 @@ public:
|
|||||||
inline Index rank() const
|
inline Index rank() const
|
||||||
{
|
{
|
||||||
using std::abs;
|
using std::abs;
|
||||||
using std::max;
|
|
||||||
eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
|
eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
|
||||||
if(m_singularValues.size()==0) return 0;
|
if(m_singularValues.size()==0) return 0;
|
||||||
RealScalar premultiplied_threshold = (max)(m_singularValues.coeff(0) * threshold(), (std::numeric_limits<RealScalar>::min)());
|
RealScalar premultiplied_threshold = numext::maxi<RealScalar>(m_singularValues.coeff(0) * threshold(), (std::numeric_limits<RealScalar>::min)());
|
||||||
Index i = m_nonzeroSingularValues-1;
|
Index i = m_nonzeroSingularValues-1;
|
||||||
while(i>=0 && m_singularValues.coeff(i) < premultiplied_threshold) --i;
|
while(i>=0 && m_singularValues.coeff(i) < premultiplied_threshold) --i;
|
||||||
return i+1;
|
return i+1;
|
||||||
|
@ -19,7 +19,7 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const
|
|||||||
{
|
{
|
||||||
typedef typename MatrixType::Scalar Scalar;
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
RealScalar eival_eps = (std::min)(test_precision<RealScalar>(), NumTraits<Scalar>::dummy_precision()*20000);
|
RealScalar eival_eps = numext::mini<RealScalar>(test_precision<RealScalar>(), NumTraits<Scalar>::dummy_precision()*20000);
|
||||||
|
|
||||||
SelfAdjointEigenSolver<MatrixType> eiSymm(m);
|
SelfAdjointEigenSolver<MatrixType> eiSymm(m);
|
||||||
VERIFY_IS_EQUAL(eiSymm.info(), Success);
|
VERIFY_IS_EQUAL(eiSymm.info(), Success);
|
||||||
|
@ -86,7 +86,7 @@ template<typename MatrixType> void qr_invertible()
|
|||||||
VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());
|
VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());
|
||||||
// This test is tricky if the determinant becomes too small.
|
// This test is tricky if the determinant becomes too small.
|
||||||
// Since we generate random numbers with magnitude rrange [0,1], the average determinant is 0.5^size
|
// Since we generate random numbers with magnitude rrange [0,1], the average determinant is 0.5^size
|
||||||
VERIFY_IS_MUCH_SMALLER_THAN( abs(absdet-qr.absDeterminant()), (max)(RealScalar(pow(0.5,size)),(max)(abs(absdet),abs(qr.absDeterminant()))) );
|
VERIFY_IS_MUCH_SMALLER_THAN( abs(absdet-qr.absDeterminant()), numext::maxi(RealScalar(pow(0.5,size)),numext::maxi<RealScalar>(abs(absdet),abs(qr.absDeterminant()))) );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user