Enable to view a SparseVector as a Ref<SparseMatrix>

This commit is contained in:
Gael Guennebaud 2015-10-06 11:53:19 +02:00
parent 1b43860bc1
commit 9a070638de
2 changed files with 21 additions and 2 deletions

View File

@ -63,7 +63,7 @@ class SparseMapBase<Derived,ReadOnlyAccessors>
Index m_outerSize; Index m_outerSize;
Index m_innerSize; Index m_innerSize;
Index m_nnz; Array<StorageIndex,2,1> m_zero_nnz;
IndexPointer m_outerIndex; IndexPointer m_outerIndex;
IndexPointer m_innerIndices; IndexPointer m_innerIndices;
ScalarPointer m_values; ScalarPointer m_values;
@ -75,6 +75,7 @@ class SparseMapBase<Derived,ReadOnlyAccessors>
inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; } inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
inline Index innerSize() const { return m_innerSize; } inline Index innerSize() const { return m_innerSize; }
inline Index outerSize() const { return m_outerSize; } inline Index outerSize() const { return m_outerSize; }
inline Index nonZeros() const { return m_zero_nnz[1]; }
bool isCompressed() const { return m_innerNonZeros==0; } 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, inline SparseMapBase(Index rows, Index cols, Index nnz, IndexPointer outerIndexPtr, IndexPointer innerIndexPtr,
ScalarPointer valuePtr, IndexPointer innerNonZerosPtr = 0) 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) 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 */ /** Empty destructor */
inline ~SparseMapBase() {} inline ~SparseMapBase() {}
}; };

View File

@ -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()); ::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 } // namespace internal