aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/SparseCore
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-09-01 22:34:30 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-09-01 22:34:30 +0200
commit6059188f9dbac841ef0c9cc533047c0a3bd12d94 (patch)
treeb69f580992b0423ca594c0ef0622ac36f14f30b5 /Eigen/src/SparseCore
parent0b2412df5081e54fe2ff67a51ab24a097e36ce91 (diff)
Simplify implementation of the evaluation's iterator of Sparse*Diagonal products to help the compiler to generate better code.
Diffstat (limited to 'Eigen/src/SparseCore')
-rw-r--r--Eigen/src/SparseCore/SparseDiagonalProduct.h42
1 files changed, 16 insertions, 26 deletions
diff --git a/Eigen/src/SparseCore/SparseDiagonalProduct.h b/Eigen/src/SparseCore/SparseDiagonalProduct.h
index d82927216..13b2f07bd 100644
--- a/Eigen/src/SparseCore/SparseDiagonalProduct.h
+++ b/Eigen/src/SparseCore/SparseDiagonalProduct.h
@@ -96,48 +96,38 @@ struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwi
{
typedef typename SparseXprType::Scalar Scalar;
- typedef CwiseBinaryOp<scalar_product_op<Scalar>,
- const typename SparseXprType::ConstInnerVectorReturnType,
- const DiagCoeffType> CwiseProductType;
-
- typedef typename evaluator<CwiseProductType>::type CwiseProductEval;
- typedef typename evaluator<CwiseProductType>::InnerIterator CwiseProductIterator;
+ typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
+ : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
class InnerIterator
{
+ typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
public:
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
- : m_cwiseXpr(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)),
- m_cwiseEval(m_cwiseXpr),
- m_cwiseIter(m_cwiseEval, 0),
- m_outer(outer)
+ : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
{}
- inline Scalar value() const { return m_cwiseIter.value(); }
- inline Index index() const { return m_cwiseIter.index(); }
- inline Index outer() const { return m_outer; }
- inline Index col() const { return SparseXprType::IsRowMajor ? m_cwiseIter.index() : m_outer; }
- inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : m_cwiseIter.index(); }
+ inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
+ inline Index index() const { return m_sparseIter.index(); }
+ inline Index outer() const { return m_sparseIter.outer(); }
+ inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
+ inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
- EIGEN_STRONG_INLINE InnerIterator& operator++()
- { ++m_cwiseIter; return *this; }
- inline operator bool() const { return m_cwiseIter; }
+ EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; }
+ inline operator bool() const { return m_sparseIter; }
protected:
- const CwiseProductType m_cwiseXpr;
- CwiseProductEval m_cwiseEval;
- CwiseProductIterator m_cwiseIter;
- Index m_outer;
+ SparseXprIter m_sparseIter;
+ DiagCoeffNested m_diagCoeffNested;
};
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
- : m_sparseXprNested(sparseXpr), m_diagCoeffNested(diagCoeff)
+ : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
{}
protected:
- typename nested_eval<SparseXprType,1>::type m_sparseXprNested;
- typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
- : SparseXprType::ColsAtCompileTime>::type m_diagCoeffNested;
+ typename evaluator<SparseXprType>::type m_sparseXprEval;
+ DiagCoeffNested m_diagCoeffNested;
};
} // end namespace internal