mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-05-12 15:58:05 +08:00
bug #982: Make sure numext::maxi and numext::mini are called correctly, in case Scalar expressions return expression templates.
This commit is contained in:
parent
2adbf6b8ca
commit
58af8bf90c
@ -417,7 +417,7 @@ EigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvect
|
|||||||
{
|
{
|
||||||
Scalar t0 = m_matT.coeff(i+1, i);
|
Scalar t0 = m_matT.coeff(i+1, i);
|
||||||
Scalar t1 = m_matT.coeff(i, i+1);
|
Scalar t1 = m_matT.coeff(i, i+1);
|
||||||
Scalar maxval = numext::maxi(abs(p),numext::maxi(abs(t0),abs(t1)));
|
Scalar maxval = numext::maxi<Scalar>(abs(p),numext::maxi<Scalar>(abs(t0),abs(t1)));
|
||||||
t0 /= maxval;
|
t0 /= maxval;
|
||||||
t1 /= maxval;
|
t1 /= maxval;
|
||||||
Scalar p0 = p/maxval;
|
Scalar p0 = p/maxval;
|
||||||
@ -608,7 +608,7 @@ void EigenSolver<MatrixType>::doComputeEigenvectors()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Overflow control
|
// Overflow control
|
||||||
Scalar t = numext::maxi(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
|
Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
|
||||||
if ((eps * t) * t > Scalar(1))
|
if ((eps * t) * t > Scalar(1))
|
||||||
m_matT.block(i, n-1, size-i, 2) /= t;
|
m_matT.block(i, n-1, size-i, 2) /= t;
|
||||||
|
|
||||||
|
@ -743,7 +743,7 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayXr& col0, const ArrayXr& dia
|
|||||||
// rational interpolation: fit a function of the form a / mu + b through the two previous
|
// rational interpolation: fit a function of the form a / mu + b through the two previous
|
||||||
// iterates and use its zero to compute the next iterate
|
// iterates and use its zero to compute the next iterate
|
||||||
bool useBisection = fPrev*fCur>0;
|
bool useBisection = fPrev*fCur>0;
|
||||||
while (fCur!=0 && abs(muCur - muPrev) > 8 * NumTraits<RealScalar>::epsilon() * numext::maxi(abs(muCur), abs(muPrev)) && abs(fCur - fPrev)>NumTraits<RealScalar>::epsilon() && !useBisection)
|
while (fCur!=0 && abs(muCur - muPrev) > 8 * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(muCur), abs(muPrev)) && abs(fCur - fPrev)>NumTraits<RealScalar>::epsilon() && !useBisection)
|
||||||
{
|
{
|
||||||
++m_numIters;
|
++m_numIters;
|
||||||
|
|
||||||
@ -794,7 +794,7 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayXr& col0, const ArrayXr& dia
|
|||||||
#endif
|
#endif
|
||||||
eigen_internal_assert(fLeft * fRight < 0);
|
eigen_internal_assert(fLeft * fRight < 0);
|
||||||
|
|
||||||
while (rightShifted - leftShifted > 2 * NumTraits<RealScalar>::epsilon() * numext::maxi(abs(leftShifted), abs(rightShifted)))
|
while (rightShifted - leftShifted > 2 * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted)))
|
||||||
{
|
{
|
||||||
RealScalar midShifted = (leftShifted + rightShifted) / 2;
|
RealScalar midShifted = (leftShifted + rightShifted) / 2;
|
||||||
RealScalar fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
|
RealScalar fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
|
||||||
@ -1004,7 +1004,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
|
|||||||
|
|
||||||
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 = NumTraits<RealScalar>::epsilon() * maxDiag;
|
RealScalar epsilon_strict = NumTraits<RealScalar>::epsilon() * maxDiag;
|
||||||
RealScalar epsilon_coarse = 8 * NumTraits<RealScalar>::epsilon() * numext::maxi(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
|
||||||
assert(m_naiveU.allFinite());
|
assert(m_naiveU.allFinite());
|
||||||
|
@ -722,7 +722,8 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
|
|||||||
// if this 2x2 sub-matrix is not diagonal already...
|
// if this 2x2 sub-matrix is not diagonal already...
|
||||||
// notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't
|
// notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't
|
||||||
// keep us iterating forever. Similarly, small denormal numbers are considered zero.
|
// keep us iterating forever. Similarly, small denormal numbers are considered zero.
|
||||||
RealScalar threshold = numext::maxi(considerAsZero, precision * numext::maxi(abs(m_workMatrix.coeff(p,p)),
|
RealScalar threshold = numext::maxi<RealScalar>(considerAsZero,
|
||||||
|
precision * numext::maxi<RealScalar>(abs(m_workMatrix.coeff(p,p)),
|
||||||
abs(m_workMatrix.coeff(q,q))));
|
abs(m_workMatrix.coeff(q,q))));
|
||||||
// We compare both values to threshold instead of calling max to be robust to NaN (See bug 791)
|
// We compare both values to threshold instead of calling max to be robust to NaN (See bug 791)
|
||||||
if(abs(m_workMatrix.coeff(p,q))>threshold || abs(m_workMatrix.coeff(q,p)) > threshold)
|
if(abs(m_workMatrix.coeff(p,q))>threshold || abs(m_workMatrix.coeff(q,p)) > threshold)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user