mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
generalize the prune function
This commit is contained in:
parent
02c8b6af82
commit
1d4e80f09d
@ -333,16 +333,38 @@ class SparseMatrix
|
|||||||
|
|
||||||
/** Suppress all nonzeros which are smaller than \a reference under the tolerence \a epsilon */
|
/** Suppress all nonzeros which are smaller than \a reference under the tolerence \a epsilon */
|
||||||
void prune(Scalar reference, RealScalar epsilon = NumTraits<RealScalar>::dummy_precision())
|
void prune(Scalar reference, RealScalar epsilon = NumTraits<RealScalar>::dummy_precision())
|
||||||
|
{
|
||||||
|
struct func {
|
||||||
|
func(Scalar ref, RealScalar eps) : reference(ref), epsilon(eps) {}
|
||||||
|
inline bool operator() (const Index& row, const Index& col, const Scalar& value) const
|
||||||
|
{
|
||||||
|
return !internal::isMuchSmallerThan(value, reference, epsilon);
|
||||||
|
}
|
||||||
|
Scalar reference;
|
||||||
|
RealScalar epsilon;
|
||||||
|
};
|
||||||
|
prune(func(reference,epsilon));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Suppress all nonzeros which do not satisfy the predicate \a keep.
|
||||||
|
* The functor type \a KeepFunc must implement the following function:
|
||||||
|
* \code
|
||||||
|
* bool operator() (const Index& row, const Index& col, const Scalar& value) const;
|
||||||
|
* \endcode
|
||||||
|
* \sa prune(Scalar,RealScalar)
|
||||||
|
*/
|
||||||
|
template<typename KeepFunc>
|
||||||
|
void prune(const KeepFunc& keep = KeepFunc())
|
||||||
{
|
{
|
||||||
Index k = 0;
|
Index k = 0;
|
||||||
for (Index j=0; j<m_outerSize; ++j)
|
for(Index j=0; j<m_outerSize; ++j)
|
||||||
{
|
{
|
||||||
Index previousStart = m_outerIndex[j];
|
Index previousStart = m_outerIndex[j];
|
||||||
m_outerIndex[j] = k;
|
m_outerIndex[j] = k;
|
||||||
Index end = m_outerIndex[j+1];
|
Index end = m_outerIndex[j+1];
|
||||||
for (Index i=previousStart; i<end; ++i)
|
for(Index i=previousStart; i<end; ++i)
|
||||||
{
|
{
|
||||||
if (!internal::isMuchSmallerThan(m_data.value(i), reference, epsilon))
|
if(keep(IsRowMajor?j:m_data.index(i), IsRowMajor?m_data.index(i):j, m_data.value(i)))
|
||||||
{
|
{
|
||||||
m_data.value(k) = m_data.value(i);
|
m_data.value(k) = m_data.value(i);
|
||||||
m_data.index(k) = m_data.index(i);
|
m_data.index(k) = m_data.index(i);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user