mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-30 17:40:05 +08:00
Simplify implementation of the evaluation's iterator of Sparse*Diagonal products to help the compiler to generate better code.
This commit is contained in:
parent
0b2412df50
commit
6059188f9d
@ -96,48 +96,38 @@ struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwi
|
|||||||
{
|
{
|
||||||
typedef typename SparseXprType::Scalar Scalar;
|
typedef typename SparseXprType::Scalar Scalar;
|
||||||
|
|
||||||
typedef CwiseBinaryOp<scalar_product_op<Scalar>,
|
typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
|
||||||
const typename SparseXprType::ConstInnerVectorReturnType,
|
: SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
|
||||||
const DiagCoeffType> CwiseProductType;
|
|
||||||
|
|
||||||
typedef typename evaluator<CwiseProductType>::type CwiseProductEval;
|
|
||||||
typedef typename evaluator<CwiseProductType>::InnerIterator CwiseProductIterator;
|
|
||||||
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
|
typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
|
||||||
public:
|
public:
|
||||||
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
|
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
|
||||||
: m_cwiseXpr(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)),
|
: m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
|
||||||
m_cwiseEval(m_cwiseXpr),
|
|
||||||
m_cwiseIter(m_cwiseEval, 0),
|
|
||||||
m_outer(outer)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
inline Scalar value() const { return m_cwiseIter.value(); }
|
inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
|
||||||
inline Index index() const { return m_cwiseIter.index(); }
|
inline Index index() const { return m_sparseIter.index(); }
|
||||||
inline Index outer() const { return m_outer; }
|
inline Index outer() const { return m_sparseIter.outer(); }
|
||||||
inline Index col() const { return SparseXprType::IsRowMajor ? m_cwiseIter.index() : m_outer; }
|
inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
|
||||||
inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : m_cwiseIter.index(); }
|
inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE InnerIterator& operator++()
|
EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; }
|
||||||
{ ++m_cwiseIter; return *this; }
|
inline operator bool() const { return m_sparseIter; }
|
||||||
inline operator bool() const { return m_cwiseIter; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const CwiseProductType m_cwiseXpr;
|
SparseXprIter m_sparseIter;
|
||||||
CwiseProductEval m_cwiseEval;
|
DiagCoeffNested m_diagCoeffNested;
|
||||||
CwiseProductIterator m_cwiseIter;
|
|
||||||
Index m_outer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
|
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
|
||||||
: m_sparseXprNested(sparseXpr), m_diagCoeffNested(diagCoeff)
|
: m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typename nested_eval<SparseXprType,1>::type m_sparseXprNested;
|
typename evaluator<SparseXprType>::type m_sparseXprEval;
|
||||||
typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
|
DiagCoeffNested m_diagCoeffNested;
|
||||||
: SparseXprType::ColsAtCompileTime>::type m_diagCoeffNested;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
Loading…
Reference in New Issue
Block a user