diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-07-15 10:55:03 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-07-15 10:55:03 +0200 |
commit | 3c7686630d08de89064ad7c8d0b0d619c108fb67 (patch) | |
tree | 5484553c8b2012fb57435b314c6e627893484bcf /Eigen/src/SparseCore/SparseDenseProduct.h | |
parent | 296cb4016124d5c186ed65637888bb1c2c5fda2f (diff) | |
parent | 4f440b81237a2624e4bf927b279b4a399469b28d (diff) |
merge with default branch
Diffstat (limited to 'Eigen/src/SparseCore/SparseDenseProduct.h')
-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 2a23365c6..36d9f637c 100644 --- a/Eigen/src/SparseCore/SparseDenseProduct.h +++ b/Eigen/src/SparseCore/SparseDenseProduct.h @@ -165,7 +165,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 @@ -175,7 +178,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 { @@ -260,17 +266,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; }; |