diff options
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/SparseCore/SparseMap.h | 11 | ||||
-rw-r--r-- | Eigen/src/SparseCore/SparseRef.h | 12 |
2 files changed, 21 insertions, 2 deletions
diff --git a/Eigen/src/SparseCore/SparseMap.h b/Eigen/src/SparseCore/SparseMap.h index 7c512d9fe..2ef4181bc 100644 --- a/Eigen/src/SparseCore/SparseMap.h +++ b/Eigen/src/SparseCore/SparseMap.h @@ -63,7 +63,7 @@ class SparseMapBase<Derived,ReadOnlyAccessors> Index m_outerSize; Index m_innerSize; - Index m_nnz; + Array<StorageIndex,2,1> m_zero_nnz; IndexPointer m_outerIndex; IndexPointer m_innerIndices; ScalarPointer m_values; @@ -75,6 +75,7 @@ class SparseMapBase<Derived,ReadOnlyAccessors> inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; } inline Index innerSize() const { return m_innerSize; } inline Index outerSize() const { return m_outerSize; } + inline Index nonZeros() const { return m_zero_nnz[1]; } bool isCompressed() const { return m_innerNonZeros==0; } @@ -107,10 +108,16 @@ class SparseMapBase<Derived,ReadOnlyAccessors> inline SparseMapBase(Index rows, Index cols, Index nnz, IndexPointer outerIndexPtr, IndexPointer innerIndexPtr, ScalarPointer valuePtr, IndexPointer innerNonZerosPtr = 0) - : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr), + : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_zero_nnz(0,internal::convert_index<StorageIndex>(nnz)), m_outerIndex(outerIndexPtr), m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(innerNonZerosPtr) {} + // for vectors + inline SparseMapBase(Index size, Index nnz, IndexPointer innerIndexPtr, ScalarPointer valuePtr) + : m_outerSize(1), m_innerSize(size), m_zero_nnz(0,nnz), m_outerIndex(m_zero_nnz.data()), + m_innerIndices(innerIndexPtr), m_values(valuePtr), m_innerNonZeros(0) + {} + /** Empty destructor */ inline ~SparseMapBase() {} }; diff --git a/Eigen/src/SparseCore/SparseRef.h b/Eigen/src/SparseCore/SparseRef.h index 8df62a119..08268b9e1 100644 --- a/Eigen/src/SparseCore/SparseRef.h +++ b/Eigen/src/SparseCore/SparseRef.h @@ -72,6 +72,18 @@ protected: { ::new (static_cast<Base*>(this)) Base(expr.rows(), expr.cols(), expr.nonZeros(), expr.outerIndexPtr(), expr.innerIndexPtr(), expr.valuePtr(), expr.innerNonZeroPtr()); } + + template<int ExprOptions> + void construct(const SparseVector<Scalar,ExprOptions,StorageIndex>& expr) + { + ::new (static_cast<Base*>(this)) Base(expr.size(), expr.nonZeros(), expr.innerIndexPtr(), expr.valuePtr()); + } + + template<int ExprOptions> + void construct(SparseVector<Scalar,ExprOptions,StorageIndex>& expr) + { + ::new (static_cast<Base*>(this)) Base(expr.size(), expr.nonZeros(), expr.innerIndexPtr(), expr.valuePtr()); + } }; } // namespace internal |