10#ifndef EIGEN_RANK_REVEALING_BASE_H
11#define EIGEN_RANK_REVEALING_BASE_H
14#include "./InternalHeaderCheck.h"
28template <
typename Derived>
29class RankRevealingBase {
31 using Scalar =
typename internal::traits<Derived>::Scalar;
32 using RealScalar =
typename NumTraits<Scalar>::Real;
35 : m_usePrescribedThreshold(
false),
36 m_prescribedThreshold(RealScalar(0)),
37 m_maxpivot(RealScalar(0)),
38 m_nonzero_pivots(0) {}
58 m_usePrescribedThreshold =
true;
72 m_usePrescribedThreshold =
false;
81 eigen_assert(self().m_isInitialized || m_usePrescribedThreshold);
84 return m_usePrescribedThreshold
85 ? m_prescribedThreshold
86 : NumTraits<Scalar>::epsilon() * RealScalar(4 * (std::min)(self().rows(), self().cols()));
95 inline Index
rank()
const {
97 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
98 RealScalar premultiplied_threshold = abs(m_maxpivot) *
threshold();
100 for (Index i = 0; i < m_nonzero_pivots; ++i) result += (self().pivotCoeff(i) > premultiplied_threshold);
111 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
112 return self().cols() -
rank();
123 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
124 return rank() == self().cols();
135 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
136 return rank() == self().rows();
146 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
158 eigen_assert(self().m_isInitialized &&
"Decomposition is not initialized.");
159 return m_nonzero_pivots;
168 bool m_usePrescribedThreshold;
169 RealScalar m_prescribedThreshold;
170 RealScalar m_maxpivot;
171 Index m_nonzero_pivots;
174 Derived& self() {
return static_cast<Derived&
>(*this); }
175 const Derived& self()
const {
return static_cast<const Derived&
>(*this); }
Index dimensionOfKernel() const
Definition RankRevealingBase.h:110
bool isInjective() const
Definition RankRevealingBase.h:122
bool isSurjective() const
Definition RankRevealingBase.h:134
Derived & setThreshold(Default_t)
Definition RankRevealingBase.h:71
Derived & setThreshold(const RealScalar &threshold)
Definition RankRevealingBase.h:57
Index nonzeroPivots() const
Definition RankRevealingBase.h:157
RealScalar threshold() const
Definition RankRevealingBase.h:80
RealScalar maxPivot() const
Definition RankRevealingBase.h:165
Index rank() const
Definition RankRevealingBase.h:95
bool isInvertible() const
Definition RankRevealingBase.h:145