mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-30 02:03:14 +08:00
* 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:
parent
81cb887baf
commit
8973d12cda
@ -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"
|
||||||
|
@ -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
|
@ -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>
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user