aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/SparseCore/SparseDenseProduct.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-07-16 17:00:54 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-07-16 17:00:54 +0200
commita53f2b0e4339df24c9075fe2804917803bca0b2e (patch)
treeca08c9b144b5f35be92f71131042009a33b85599 /Eigen/src/SparseCore/SparseDenseProduct.h
parentcd0b433540cf8722be689d96a915e184c9cbb22b (diff)
bug #838: add unit test for fill-in in sparse outer product and fix abusive fill-in.
Diffstat (limited to 'Eigen/src/SparseCore/SparseDenseProduct.h')
-rw-r--r--Eigen/src/SparseCore/SparseDenseProduct.h14
1 files changed, 8 insertions, 6 deletions
diff --git a/Eigen/src/SparseCore/SparseDenseProduct.h b/Eigen/src/SparseCore/SparseDenseProduct.h
index a3772c255..295b2e81f 100644
--- a/Eigen/src/SparseCore/SparseDenseProduct.h
+++ b/Eigen/src/SparseCore/SparseDenseProduct.h
@@ -120,31 +120,33 @@ 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(get(prod.rhs(), outer, typename internal::traits<Rhs>::StorageKind() ))
- { }
+ : Base(prod.lhs(), 0), m_outer(outer), m_empty(false), m_factor(get(prod.rhs(), outer, typename internal::traits<Rhs>::StorageKind() ))
+ {}
inline Index outer() const { return m_outer; }
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; }
+ inline operator bool() const { return Base::operator bool() && !m_empty; }
protected:
- static Scalar get(const _RhsNested &rhs, Index outer, Dense = Dense())
+ Scalar get(const _RhsNested &rhs, Index outer, Dense = Dense()) const
{
return rhs.coeff(outer);
}
- static Scalar get(const _RhsNested &rhs, Index outer, Sparse = Sparse())
+ Scalar get(const _RhsNested &rhs, Index outer, Sparse = Sparse())
{
typename Traits::_RhsNested::InnerIterator it(rhs, outer);
- if (it && it.index()==0)
+ if (it && it.index()==0 && it.value()!=0)
return it.value();
-
+ m_empty = true;
return Scalar(0);
}
Index m_outer;
+ bool m_empty;
Scalar m_factor;
};