diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-07-11 16:25:36 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-07-11 16:25:36 +0200 |
commit | c0f76ce2cf1780c7b638071d45cba2a3d04f2f6f (patch) | |
tree | e07dc72ba466015acb8c29d51c9c7485463dcaa6 /Eigen | |
parent | df604e4f499edcb8ddc17692685cf736067a95f2 (diff) |
Fix bug #838: fix dense * sparse and sparse * dense outer products
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/SparseCore/SparseDenseProduct.h | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/Eigen/src/SparseCore/SparseDenseProduct.h b/Eigen/src/SparseCore/SparseDenseProduct.h index 610833f3b..a3772c255 100644 --- a/Eigen/src/SparseCore/SparseDenseProduct.h +++ b/Eigen/src/SparseCore/SparseDenseProduct.h @@ -19,7 +19,10 @@ template<typename Lhs, typename Rhs, int InnerSize> struct SparseDenseProductRet template<typename Lhs, typename Rhs> struct SparseDenseProductReturnType<Lhs,Rhs,1> { - typedef SparseDenseOuterProduct<Lhs,Rhs,false> Type; + typedef typename internal::conditional< + Lhs::IsRowMajor, + SparseDenseOuterProduct<Rhs,Lhs,true>, + SparseDenseOuterProduct<Lhs,Rhs,false> >::type Type; }; template<typename Lhs, typename Rhs, int InnerSize> struct DenseSparseProductReturnType @@ -29,7 +32,10 @@ template<typename Lhs, typename Rhs, int InnerSize> struct DenseSparseProductRet template<typename Lhs, typename Rhs> struct DenseSparseProductReturnType<Lhs,Rhs,1> { - typedef SparseDenseOuterProduct<Rhs,Lhs,true> Type; + typedef typename internal::conditional< + Rhs::IsRowMajor, + SparseDenseOuterProduct<Rhs,Lhs,true>, + SparseDenseOuterProduct<Lhs,Rhs,false> >::type Type; }; namespace internal { @@ -114,17 +120,30 @@ class SparseDenseOuterProduct<Lhs,Rhs,Transpose>::InnerIterator : public _LhsNes typedef typename SparseDenseOuterProduct::Index Index; public: EIGEN_STRONG_INLINE InnerIterator(const SparseDenseOuterProduct& prod, Index outer) - : Base(prod.lhs(), 0), m_outer(outer), m_factor(prod.rhs().coeff(outer)) - { - } + : Base(prod.lhs(), 0), m_outer(outer), m_factor(get(prod.rhs(), outer, typename internal::traits<Rhs>::StorageKind() )) + { } inline Index outer() const { return m_outer; } - inline Index row() const { return Transpose ? Base::row() : m_outer; } - inline Index col() const { return Transpose ? m_outer : Base::row(); } + inline Index row() const { return Transpose ? m_outer : Base::index(); } + inline Index col() const { return Transpose ? Base::index() : m_outer; } inline Scalar value() const { return Base::value() * m_factor; } protected: + static Scalar get(const _RhsNested &rhs, Index outer, Dense = Dense()) + { + return rhs.coeff(outer); + } + + static Scalar get(const _RhsNested &rhs, Index outer, Sparse = Sparse()) + { + typename Traits::_RhsNested::InnerIterator it(rhs, outer); + if (it && it.index()==0) + return it.value(); + + return Scalar(0); + } + Index m_outer; Scalar m_factor; }; |