From 8973d12cdae503e0996edd52f8c78879274c0e70 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 20 Jan 2009 16:37:52 +0000 Subject: [PATCH] * QR: add a rank() method and improve the accuracy of the rank * computation * Array: add a count() method and rename AllAndAny.h file to BooleanRedux.h --- Eigen/Array | 2 +- .../src/Array/{AllAndAny.h => BooleanRedux.h} | 16 +++++++++++-- Eigen/src/Array/Functors.h | 1 - Eigen/src/Core/MatrixBase.h | 1 + Eigen/src/QR/QR.h | 24 ++++++++++++++++++- 5 files changed, 39 insertions(+), 5 deletions(-) rename Eigen/src/Array/{AllAndAny.h => BooleanRedux.h} (91%) diff --git a/Eigen/Array b/Eigen/Array index dc1cf03c0..fe2a861e4 100644 --- a/Eigen/Array +++ b/Eigen/Array @@ -26,7 +26,7 @@ namespace Eigen { #include "src/Array/CwiseOperators.h" #include "src/Array/Functors.h" -#include "src/Array/AllAndAny.h" +#include "src/Array/BooleanRedux.h" #include "src/Array/Select.h" #include "src/Array/PartialRedux.h" #include "src/Array/Random.h" diff --git a/Eigen/src/Array/AllAndAny.h b/Eigen/src/Array/BooleanRedux.h similarity index 91% rename from Eigen/src/Array/AllAndAny.h rename to Eigen/src/Array/BooleanRedux.h index ac2760f1a..4e8218327 100644 --- a/Eigen/src/Array/AllAndAny.h +++ b/Eigen/src/Array/BooleanRedux.h @@ -89,7 +89,7 @@ struct ei_any_unroller * \sa MatrixBase::any(), Cwise::operator<() */ template -inline bool MatrixBase::all(void) const +inline bool MatrixBase::all() const { const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT; @@ -113,7 +113,7 @@ inline bool MatrixBase::all(void) const * \sa MatrixBase::all() */ template -inline bool MatrixBase::any(void) const +inline bool MatrixBase::any() const { const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits::AddCost) <= EIGEN_UNROLLING_LIMIT; @@ -130,4 +130,16 @@ inline bool MatrixBase::any(void) const } } +/** \array_module + * + * \returns the number of coefficients which evaluate to true + * + * \sa MatrixBase::all(), MatrixBase::any() + */ +template +inline int MatrixBase::count() const +{ + return this->cast().cast().sum(); +} + #endif // EIGEN_ALLANDANY_H diff --git a/Eigen/src/Array/Functors.h b/Eigen/src/Array/Functors.h index 1e3804311..0aae7fd2c 100644 --- a/Eigen/src/Array/Functors.h +++ b/Eigen/src/Array/Functors.h @@ -200,7 +200,6 @@ template struct ei_functor_traits > { enum { Cost = 2*NumTraits::MulCost, PacketAccess = int(ei_packet_traits::size)>1 }; }; - // default ei_functor_traits for STL functors: template diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index 8c755c592..41dd894d7 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -557,6 +557,7 @@ template class MatrixBase bool all(void) const; bool any(void) const; + int count() const; const PartialRedux rowwise() const; const PartialRedux colwise() const; diff --git a/Eigen/src/QR/QR.h b/Eigen/src/QR/QR.h index 7712bfbf2..13d49a4a3 100644 --- a/Eigen/src/QR/QR.h +++ b/Eigen/src/QR/QR.h @@ -57,7 +57,9 @@ template class QR } /** \returns whether or not the matrix is of full rank */ - bool isFullRank() const { return !ei_isMuchSmallerThan(m_qr.diagonal().cwise().abs().minCoeff(), Scalar(1)); } + bool isFullRank() const { return rank() == std::min(m_qr.rows(),m_qr.cols()); } + + int rank() const; /** \returns a read-only expression of the matrix R of the actual the QR decomposition */ const Part, UpperTriangular> @@ -76,13 +78,33 @@ template class QR protected: MatrixType m_qr; VectorType m_hCoeffs; + mutable int m_rank; + mutable bool m_rankIsUptodate; }; +/** \returns the rank of the matrix of which *this is the QR decomposition. */ +template +int QR::rank() const +{ + if (!m_rankIsUptodate) + { + RealScalar maxCoeff = m_qr.diagonal().maxCoeff(); + int n = std::min(m_qr.rows(),m_qr.cols()); + m_rank = n; + for (int i=0; i void QR::_compute(const MatrixType& matrix) { + m_rankIsUptodate = false; m_qr = matrix; int rows = matrix.rows(); int cols = matrix.cols();