* 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
This commit is contained in:
Gael Guennebaud 2009-01-20 16:37:52 +00:00
parent 81cb887baf
commit 8973d12cda
5 changed files with 39 additions and 5 deletions

View File

@ -26,7 +26,7 @@ namespace Eigen {
#include "src/Array/CwiseOperators.h" #include "src/Array/CwiseOperators.h"
#include "src/Array/Functors.h" #include "src/Array/Functors.h"
#include "src/Array/AllAndAny.h" #include "src/Array/BooleanRedux.h"
#include "src/Array/Select.h" #include "src/Array/Select.h"
#include "src/Array/PartialRedux.h" #include "src/Array/PartialRedux.h"
#include "src/Array/Random.h" #include "src/Array/Random.h"

View File

@ -89,7 +89,7 @@ struct ei_any_unroller<Derived, Dynamic>
* \sa MatrixBase::any(), Cwise::operator<() * \sa MatrixBase::any(), Cwise::operator<()
*/ */
template<typename Derived> template<typename Derived>
inline bool MatrixBase<Derived>::all(void) const inline bool MatrixBase<Derived>::all() const
{ {
const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost)
<= EIGEN_UNROLLING_LIMIT; <= EIGEN_UNROLLING_LIMIT;
@ -113,7 +113,7 @@ inline bool MatrixBase<Derived>::all(void) const
* \sa MatrixBase::all() * \sa MatrixBase::all()
*/ */
template<typename Derived> template<typename Derived>
inline bool MatrixBase<Derived>::any(void) const inline bool MatrixBase<Derived>::any() const
{ {
const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) const bool unroll = SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost)
<= EIGEN_UNROLLING_LIMIT; <= EIGEN_UNROLLING_LIMIT;
@ -130,4 +130,16 @@ inline bool MatrixBase<Derived>::any(void) const
} }
} }
/** \array_module
*
* \returns the number of coefficients which evaluate to true
*
* \sa MatrixBase::all(), MatrixBase::any()
*/
template<typename Derived>
inline int MatrixBase<Derived>::count() const
{
return this->cast<bool>().cast<int>().sum();
}
#endif // EIGEN_ALLANDANY_H #endif // EIGEN_ALLANDANY_H

View File

@ -200,7 +200,6 @@ template<typename Scalar>
struct ei_functor_traits<ei_scalar_cube_op<Scalar> > struct ei_functor_traits<ei_scalar_cube_op<Scalar> >
{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = int(ei_packet_traits<Scalar>::size)>1 }; }; { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = int(ei_packet_traits<Scalar>::size)>1 }; };
// default ei_functor_traits for STL functors: // default ei_functor_traits for STL functors:
template<typename T> template<typename T>

View File

@ -557,6 +557,7 @@ template<typename Derived> class MatrixBase
bool all(void) const; bool all(void) const;
bool any(void) const; bool any(void) const;
int count() const;
const PartialRedux<Derived,Horizontal> rowwise() const; const PartialRedux<Derived,Horizontal> rowwise() const;
const PartialRedux<Derived,Vertical> colwise() const; const PartialRedux<Derived,Vertical> colwise() const;

View File

@ -57,7 +57,9 @@ template<typename MatrixType> class QR
} }
/** \returns whether or not the matrix is of full rank */ /** \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 */ /** \returns a read-only expression of the matrix R of the actual the QR decomposition */
const Part<NestByValue<MatrixRBlockType>, UpperTriangular> const Part<NestByValue<MatrixRBlockType>, UpperTriangular>
@ -76,13 +78,33 @@ template<typename MatrixType> class QR
protected: protected:
MatrixType m_qr; MatrixType m_qr;
VectorType m_hCoeffs; 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<typename MatrixType>
int QR<MatrixType>::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<n; ++i)
if (ei_isMuchSmallerThan(m_qr.diagonal().coeff(i), maxCoeff))
--m_rank;
m_rankIsUptodate = true;
}
return m_rank;
}
#ifndef EIGEN_HIDE_HEAVY_CODE #ifndef EIGEN_HIDE_HEAVY_CODE
template<typename MatrixType> template<typename MatrixType>
void QR<MatrixType>::_compute(const MatrixType& matrix) void QR<MatrixType>::_compute(const MatrixType& matrix)
{ {
m_rankIsUptodate = false;
m_qr = matrix; m_qr = matrix;
int rows = matrix.rows(); int rows = matrix.rows();
int cols = matrix.cols(); int cols = matrix.cols();