Make MatrixBase::is* methods aware of nested_eval.

This commit is contained in:
Gael Guennebaud 2015-03-24 13:42:42 +01:00
parent f42b105f73
commit 29eaa2b0f1
2 changed files with 10 additions and 7 deletions

View File

@ -300,9 +300,10 @@ template<typename Derived>
bool DenseBase<Derived>::isApproxToConstant bool DenseBase<Derived>::isApproxToConstant
(const Scalar& val, const RealScalar& prec) const (const Scalar& val, const RealScalar& prec) const
{ {
typename internal::nested_eval<Derived,1>::type self(derived());
for(Index j = 0; j < cols(); ++j) for(Index j = 0; j < cols(); ++j)
for(Index i = 0; i < rows(); ++i) for(Index i = 0; i < rows(); ++i)
if(!internal::isApprox(this->coeff(i, j), val, prec)) if(!internal::isApprox(self.coeff(i, j), val, prec))
return false; return false;
return true; return true;
} }
@ -484,9 +485,10 @@ DenseBase<Derived>::Zero()
template<typename Derived> template<typename Derived>
bool DenseBase<Derived>::isZero(const RealScalar& prec) const bool DenseBase<Derived>::isZero(const RealScalar& prec) const
{ {
typename internal::nested_eval<Derived,1>::type self(derived());
for(Index j = 0; j < cols(); ++j) for(Index j = 0; j < cols(); ++j)
for(Index i = 0; i < rows(); ++i) for(Index i = 0; i < rows(); ++i)
if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<Scalar>(1), prec)) if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<Scalar>(1), prec))
return false; return false;
return true; return true;
} }
@ -719,18 +721,19 @@ template<typename Derived>
bool MatrixBase<Derived>::isIdentity bool MatrixBase<Derived>::isIdentity
(const RealScalar& prec) const (const RealScalar& prec) const
{ {
typename internal::nested_eval<Derived,1>::type self(derived());
for(Index j = 0; j < cols(); ++j) for(Index j = 0; j < cols(); ++j)
{ {
for(Index i = 0; i < rows(); ++i) for(Index i = 0; i < rows(); ++i)
{ {
if(i == j) if(i == j)
{ {
if(!internal::isApprox(this->coeff(i, j), static_cast<Scalar>(1), prec)) if(!internal::isApprox(self.coeff(i, j), static_cast<Scalar>(1), prec))
return false; return false;
} }
else else
{ {
if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<RealScalar>(1), prec)) if(!internal::isMuchSmallerThan(self.coeff(i, j), static_cast<RealScalar>(1), prec))
return false; return false;
} }
} }

View File

@ -224,13 +224,13 @@ bool MatrixBase<Derived>::isOrthogonal
template<typename Derived> template<typename Derived>
bool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const bool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const
{ {
typename Derived::Nested nested(derived()); typename internal::nested_eval<Derived,1>::type self(derived());
for(Index i = 0; i < cols(); ++i) for(Index i = 0; i < cols(); ++i)
{ {
if(!internal::isApprox(nested.col(i).squaredNorm(), static_cast<RealScalar>(1), prec)) if(!internal::isApprox(self.col(i).squaredNorm(), static_cast<RealScalar>(1), prec))
return false; return false;
for(Index j = 0; j < i; ++j) for(Index j = 0; j < i; ++j)
if(!internal::isMuchSmallerThan(nested.col(i).dot(nested.col(j)), static_cast<Scalar>(1), prec)) if(!internal::isMuchSmallerThan(self.col(i).dot(self.col(j)), static_cast<Scalar>(1), prec))
return false; return false;
} }
return true; return true;