mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-10 18:59:01 +08:00
add support for read/write sub sets of inner vectors (sparse module)
This commit is contained in:
parent
d384671793
commit
8ce4503494
@ -73,7 +73,8 @@
|
|||||||
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY,
|
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY,
|
||||||
THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES,
|
THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES,
|
||||||
THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES,
|
THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES,
|
||||||
INVALID_MATRIX_TEMPLATE_PARAMETERS
|
INVALID_MATRIX_TEMPLATE_PARAMETERS,
|
||||||
|
BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,6 +83,9 @@ class DynamicSparseMatrix
|
|||||||
inline int innerSize() const { return m_innerSize; }
|
inline int innerSize() const { return m_innerSize; }
|
||||||
inline int outerSize() const { return m_data.size(); }
|
inline int outerSize() const { return m_data.size(); }
|
||||||
inline int innerNonZeros(int j) const { return m_data[j].size(); }
|
inline int innerNonZeros(int j) const { return m_data[j].size(); }
|
||||||
|
|
||||||
|
std::vector<CompressedStorage<Scalar> >& _data() { return m_data; }
|
||||||
|
const std::vector<CompressedStorage<Scalar> >& _data() const { return m_data; }
|
||||||
|
|
||||||
/** \returns the coefficient value at given position \a row, \a col
|
/** \returns the coefficient value at given position \a row, \a col
|
||||||
* This operation involes a log(rho*outer_size) binary search.
|
* This operation involes a log(rho*outer_size) binary search.
|
||||||
|
@ -26,61 +26,154 @@
|
|||||||
#ifndef EIGEN_SPARSE_BLOCK_H
|
#ifndef EIGEN_SPARSE_BLOCK_H
|
||||||
#define EIGEN_SPARSE_BLOCK_H
|
#define EIGEN_SPARSE_BLOCK_H
|
||||||
|
|
||||||
template<typename MatrixType>
|
template<typename MatrixType, int Size>
|
||||||
struct ei_traits<SparseInnerVector<MatrixType> >
|
struct ei_traits<SparseInnerVectorSet<MatrixType, Size> >
|
||||||
{
|
{
|
||||||
typedef typename ei_traits<MatrixType>::Scalar Scalar;
|
typedef typename ei_traits<MatrixType>::Scalar Scalar;
|
||||||
enum {
|
enum {
|
||||||
IsRowMajor = (int(MatrixType::Flags)&RowMajorBit)==RowMajorBit,
|
IsRowMajor = (int(MatrixType::Flags)&RowMajorBit)==RowMajorBit,
|
||||||
Flags = MatrixType::Flags,
|
Flags = MatrixType::Flags,
|
||||||
RowsAtCompileTime = IsRowMajor ? 1 : MatrixType::RowsAtCompileTime,
|
RowsAtCompileTime = IsRowMajor ? Size : MatrixType::RowsAtCompileTime,
|
||||||
ColsAtCompileTime = IsRowMajor ? MatrixType::ColsAtCompileTime : 1,
|
ColsAtCompileTime = IsRowMajor ? MatrixType::ColsAtCompileTime : Size,
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost
|
CoeffReadCost = MatrixType::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename MatrixType>
|
template<typename MatrixType, int Size>
|
||||||
class SparseInnerVector : ei_no_assignment_operator,
|
class SparseInnerVectorSet : ei_no_assignment_operator,
|
||||||
public SparseMatrixBase<SparseInnerVector<MatrixType> >
|
public SparseMatrixBase<SparseInnerVectorSet<MatrixType, Size> >
|
||||||
{
|
{
|
||||||
enum {
|
enum { IsRowMajor = ei_traits<SparseInnerVectorSet>::IsRowMajor };
|
||||||
IsRowMajor = ei_traits<SparseInnerVector>::IsRowMajor
|
public:
|
||||||
};
|
|
||||||
public:
|
|
||||||
|
|
||||||
EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVector)
|
EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVectorSet)
|
||||||
class InnerIterator;
|
class InnerIterator: public MatrixType::InnerIterator
|
||||||
|
|
||||||
inline SparseInnerVector(const MatrixType& matrix, int outer)
|
|
||||||
: m_matrix(matrix), m_outer(outer)
|
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
inline InnerIterator(const SparseInnerVectorSet& xpr, int outer)
|
||||||
|
: MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline SparseInnerVectorSet(const MatrixType& matrix, int outerStart, int outerSize)
|
||||||
|
: m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize)
|
||||||
|
{
|
||||||
|
ei_assert( (outerStart>=0) && ((outerStart+outerSize)<=matrix.outerSize()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SparseInnerVectorSet(const MatrixType& matrix, int outer)
|
||||||
|
: m_matrix(matrix), m_outerStart(outer)
|
||||||
|
{
|
||||||
|
ei_assert(Size==1);
|
||||||
ei_assert( (outer>=0) && (outer<matrix.outerSize()) );
|
ei_assert( (outer>=0) && (outer<matrix.outerSize()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// template<typename OtherDerived>
|
||||||
|
// inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)
|
||||||
|
// {
|
||||||
|
// return *this;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// template<typename Sparse>
|
||||||
|
// inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)
|
||||||
|
// {
|
||||||
|
// return *this;
|
||||||
|
// }
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE int rows() const { return IsRowMajor ? 1 : m_matrix.rows(); }
|
EIGEN_STRONG_INLINE int rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
||||||
EIGEN_STRONG_INLINE int cols() const { return IsRowMajor ? m_matrix.cols() : 1; }
|
EIGEN_STRONG_INLINE int cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
const typename MatrixType::Nested m_matrix;
|
const typename MatrixType::Nested m_matrix;
|
||||||
int m_outer;
|
int m_outerStart;
|
||||||
|
const ei_int_if_dynamic<Size> m_outerSize;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename MatrixType>
|
//----------
|
||||||
class SparseInnerVector<MatrixType>::InnerIterator : public MatrixType::InnerIterator
|
// specialisation for DynamicSparseMatrix
|
||||||
|
//----------
|
||||||
|
|
||||||
|
template<typename _Scalar, int _Options, int Size>
|
||||||
|
class SparseInnerVectorSet<DynamicSparseMatrix<_Scalar, _Options>, Size>
|
||||||
|
: public SparseMatrixBase<SparseInnerVectorSet<DynamicSparseMatrix<_Scalar, _Options>, Size> >
|
||||||
{
|
{
|
||||||
public:
|
typedef DynamicSparseMatrix<_Scalar, _Options> MatrixType;
|
||||||
inline InnerIterator(const SparseInnerVector& xpr, int outer=0)
|
enum { IsRowMajor = ei_traits<SparseInnerVectorSet>::IsRowMajor };
|
||||||
: MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outer)
|
public:
|
||||||
{
|
|
||||||
ei_assert(outer==0);
|
EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseInnerVectorSet)
|
||||||
}
|
class InnerIterator: public MatrixType::InnerIterator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline InnerIterator(const SparseInnerVectorSet& xpr, int outer)
|
||||||
|
: MatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline SparseInnerVectorSet(const MatrixType& matrix, int outerStart, int outerSize)
|
||||||
|
: m_matrix(matrix), m_outerStart(outerStart), m_outerSize(outerSize)
|
||||||
|
{
|
||||||
|
ei_assert( (outerStart>=0) && ((outerStart+outerSize)<=matrix.outerSize()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SparseInnerVectorSet(const MatrixType& matrix, int outer)
|
||||||
|
: m_matrix(matrix), m_outerStart(outer)
|
||||||
|
{
|
||||||
|
ei_assert(Size==1);
|
||||||
|
ei_assert( (outer>=0) && (outer<matrix.outerSize()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)
|
||||||
|
{
|
||||||
|
if (IsRowMajor != ((OtherDerived::Flags&RowMajorBit)==RowMajorBit))
|
||||||
|
{
|
||||||
|
// need to transpose => perform a block evaluation followed by a big swap
|
||||||
|
DynamicSparseMatrix<Scalar,IsRowMajor?RowMajorBit:0> aux(other);
|
||||||
|
*this = aux.markAsRValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// evaluate/copy vector per vector
|
||||||
|
for (int j=0; j<m_outerSize.value(); ++j)
|
||||||
|
{
|
||||||
|
SparseVector<Scalar,IsRowMajor ? RowMajorBit : 0> aux(other.innerVector(j));
|
||||||
|
m_matrix.const_cast_derived()._data()[m_outerStart+j].swap(aux._data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SparseInnerVectorSet& operator=(const SparseInnerVectorSet& other)
|
||||||
|
{
|
||||||
|
return operator=<SparseInnerVectorSet>(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
// template<typename Sparse>
|
||||||
|
// inline SparseInnerVectorSet& operator=(const SparseMatrixBase<OtherDerived>& other)
|
||||||
|
// {
|
||||||
|
// return *this;
|
||||||
|
// }
|
||||||
|
|
||||||
|
EIGEN_STRONG_INLINE int rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
||||||
|
EIGEN_STRONG_INLINE int cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
const typename MatrixType::Nested m_matrix;
|
||||||
|
int m_outerStart;
|
||||||
|
const ei_int_if_dynamic<Size> m_outerSize;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//----------
|
||||||
|
|
||||||
/** \returns the i-th row of the matrix \c *this. For row-major matrix only. */
|
/** \returns the i-th row of the matrix \c *this. For row-major matrix only. */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
SparseInnerVector<Derived> SparseMatrixBase<Derived>::row(int i)
|
SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::row(int i)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
||||||
return innerVector(i);
|
return innerVector(i);
|
||||||
@ -89,7 +182,7 @@ SparseInnerVector<Derived> SparseMatrixBase<Derived>::row(int i)
|
|||||||
/** \returns the i-th row of the matrix \c *this. For row-major matrix only.
|
/** \returns the i-th row of the matrix \c *this. For row-major matrix only.
|
||||||
* (read-only version) */
|
* (read-only version) */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
const SparseInnerVector<Derived> SparseMatrixBase<Derived>::row(int i) const
|
const SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::row(int i) const
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
||||||
return innerVector(i);
|
return innerVector(i);
|
||||||
@ -97,18 +190,18 @@ const SparseInnerVector<Derived> SparseMatrixBase<Derived>::row(int i) const
|
|||||||
|
|
||||||
/** \returns the i-th column of the matrix \c *this. For column-major matrix only. */
|
/** \returns the i-th column of the matrix \c *this. For column-major matrix only. */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
SparseInnerVector<Derived> SparseMatrixBase<Derived>::col(int i)
|
SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::col(int i)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_COL_MAJOR_MATRICES);
|
||||||
return innerVector(i);
|
return innerVector(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \returns the i-th column of the matrix \c *this. For column-major matrix only.
|
/** \returns the i-th column of the matrix \c *this. For column-major matrix only.
|
||||||
* (read-only version) */
|
* (read-only version) */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
const SparseInnerVector<Derived> SparseMatrixBase<Derived>::col(int i) const
|
const SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::col(int i) const
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_COL_MAJOR_MATRICES);
|
||||||
return innerVector(i);
|
return innerVector(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,15 +209,65 @@ const SparseInnerVector<Derived> SparseMatrixBase<Derived>::col(int i) const
|
|||||||
* is col-major (resp. row-major).
|
* is col-major (resp. row-major).
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
SparseInnerVector<Derived> SparseMatrixBase<Derived>::innerVector(int outer)
|
SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::innerVector(int outer)
|
||||||
{ return SparseInnerVector<Derived>(derived(), outer); }
|
{ return SparseInnerVectorSet<Derived,1>(derived(), outer); }
|
||||||
|
|
||||||
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
||||||
* is col-major (resp. row-major). Read-only.
|
* is col-major (resp. row-major). Read-only.
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
const SparseInnerVector<Derived> SparseMatrixBase<Derived>::innerVector(int outer) const
|
const SparseInnerVectorSet<Derived,1> SparseMatrixBase<Derived>::innerVector(int outer) const
|
||||||
{ return SparseInnerVector<Derived>(derived(), outer); }
|
{ return SparseInnerVectorSet<Derived,1>(derived(), outer); }
|
||||||
|
|
||||||
|
//----------
|
||||||
|
|
||||||
|
/** \returns the i-th row of the matrix \c *this. For row-major matrix only. */
|
||||||
|
template<typename Derived>
|
||||||
|
SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::subrows(int start, int size)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
||||||
|
return innerVectors(start, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns the i-th row of the matrix \c *this. For row-major matrix only.
|
||||||
|
* (read-only version) */
|
||||||
|
template<typename Derived>
|
||||||
|
const SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::subrows(int start, int size) const
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(IsRowMajor,THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES);
|
||||||
|
return innerVectors(start, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns the i-th column of the matrix \c *this. For column-major matrix only. */
|
||||||
|
template<typename Derived>
|
||||||
|
SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::subcols(int start, int size)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_COL_MAJOR_MATRICES);
|
||||||
|
return innerVectors(start, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns the i-th column of the matrix \c *this. For column-major matrix only.
|
||||||
|
* (read-only version) */
|
||||||
|
template<typename Derived>
|
||||||
|
const SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::subcols(int start, int size) const
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(!IsRowMajor,THIS_METHOD_IS_ONLY_FOR_COL_MAJOR_MATRICES);
|
||||||
|
return innerVectors(start, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
||||||
|
* is col-major (resp. row-major).
|
||||||
|
*/
|
||||||
|
template<typename Derived>
|
||||||
|
SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::innerVectors(int outerStart, int outerSize)
|
||||||
|
{ return SparseInnerVectorSet<Derived,Dynamic>(derived(), outerStart, outerSize); }
|
||||||
|
|
||||||
|
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
||||||
|
* is col-major (resp. row-major). Read-only.
|
||||||
|
*/
|
||||||
|
template<typename Derived>
|
||||||
|
const SparseInnerVectorSet<Derived,Dynamic> SparseMatrixBase<Derived>::innerVectors(int outerStart, int outerSize) const
|
||||||
|
{ return SparseInnerVectorSet<Derived,Dynamic>(derived(), outerStart, outerSize); }
|
||||||
|
|
||||||
# if 0
|
# if 0
|
||||||
template<typename MatrixType, int BlockRows, int BlockCols, int PacketAccess>
|
template<typename MatrixType, int BlockRows, int BlockCols, int PacketAccess>
|
||||||
|
@ -86,6 +86,8 @@ class SparseCwiseBinaryOp : ei_no_assignment_operator,
|
|||||||
EIGEN_STRONG_INLINE SparseCwiseBinaryOp(const Lhs& lhs, const Rhs& rhs, const BinaryOp& func = BinaryOp())
|
EIGEN_STRONG_INLINE SparseCwiseBinaryOp(const Lhs& lhs, const Rhs& rhs, const BinaryOp& func = BinaryOp())
|
||||||
: m_lhs(lhs), m_rhs(rhs), m_functor(func)
|
: m_lhs(lhs), m_rhs(rhs), m_functor(func)
|
||||||
{
|
{
|
||||||
|
EIGEN_STATIC_ASSERT((_LhsNested::Flags&RowMajorBit)==(_RhsNested::Flags&RowMajorBit),
|
||||||
|
BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER)
|
||||||
EIGEN_STATIC_ASSERT((ei_functor_allows_mixing_real_and_complex<BinaryOp>::ret
|
EIGEN_STATIC_ASSERT((ei_functor_allows_mixing_real_and_complex<BinaryOp>::ret
|
||||||
? int(ei_is_same_type<typename Lhs::RealScalar, typename Rhs::RealScalar>::ret)
|
? int(ei_is_same_type<typename Lhs::RealScalar, typename Rhs::RealScalar>::ret)
|
||||||
: int(ei_is_same_type<typename Lhs::Scalar, typename Rhs::Scalar>::ret)),
|
: int(ei_is_same_type<typename Lhs::Scalar, typename Rhs::Scalar>::ret)),
|
||||||
|
@ -327,18 +327,21 @@ template<typename Derived> class SparseMatrixBase
|
|||||||
// void transposeInPlace();
|
// void transposeInPlace();
|
||||||
const AdjointReturnType adjoint() const { return conjugate()/*.nestByValue()*/; }
|
const AdjointReturnType adjoint() const { return conjugate()/*.nestByValue()*/; }
|
||||||
|
|
||||||
SparseInnerVector<Derived> row(int i);
|
// sub-vector
|
||||||
const SparseInnerVector<Derived> row(int i) const;
|
SparseInnerVectorSet<Derived,1> row(int i);
|
||||||
SparseInnerVector<Derived> col(int j);
|
const SparseInnerVectorSet<Derived,1> row(int i) const;
|
||||||
const SparseInnerVector<Derived> col(int j) const;
|
SparseInnerVectorSet<Derived,1> col(int j);
|
||||||
SparseInnerVector<Derived> innerVector(int outer);
|
const SparseInnerVectorSet<Derived,1> col(int j) const;
|
||||||
const SparseInnerVector<Derived> innerVector(int outer) const;
|
SparseInnerVectorSet<Derived,1> innerVector(int outer);
|
||||||
|
const SparseInnerVectorSet<Derived,1> innerVector(int outer) const;
|
||||||
// RowXpr row(int i);
|
|
||||||
// const RowXpr row(int i) const;
|
// set of sub-vectors
|
||||||
|
SparseInnerVectorSet<Derived,Dynamic> subrows(int start, int size);
|
||||||
// ColXpr col(int i);
|
const SparseInnerVectorSet<Derived,Dynamic> subrows(int start, int size) const;
|
||||||
// const ColXpr col(int i) const;
|
SparseInnerVectorSet<Derived,Dynamic> subcols(int start, int size);
|
||||||
|
const SparseInnerVectorSet<Derived,Dynamic> subcols(int start, int size) const;
|
||||||
|
SparseInnerVectorSet<Derived,Dynamic> innerVectors(int outerStart, int outerSize);
|
||||||
|
const SparseInnerVectorSet<Derived,Dynamic> innerVectors(int outerStart, int outerSize) const;
|
||||||
|
|
||||||
// typename BlockReturnType<Derived>::Type block(int startRow, int startCol, int blockRows, int blockCols);
|
// typename BlockReturnType<Derived>::Type block(int startRow, int startCol, int blockRows, int blockCols);
|
||||||
// const typename BlockReturnType<Derived>::Type
|
// const typename BlockReturnType<Derived>::Type
|
||||||
|
@ -107,7 +107,7 @@ template<typename _Scalar, int _Flags = 0> class SparseVector;
|
|||||||
template<typename _Scalar, int _Flags = 0> class MappedSparseMatrix;
|
template<typename _Scalar, int _Flags = 0> class MappedSparseMatrix;
|
||||||
|
|
||||||
template<typename MatrixType> class SparseTranspose;
|
template<typename MatrixType> class SparseTranspose;
|
||||||
template<typename MatrixType> class SparseInnerVector;
|
template<typename MatrixType, int Size> class SparseInnerVectorSet;
|
||||||
template<typename Derived> class SparseCwise;
|
template<typename Derived> class SparseCwise;
|
||||||
template<typename UnaryOp, typename MatrixType> class SparseCwiseUnaryOp;
|
template<typename UnaryOp, typename MatrixType> class SparseCwiseUnaryOp;
|
||||||
template<typename BinaryOp, typename Lhs, typename Rhs> class SparseCwiseBinaryOp;
|
template<typename BinaryOp, typename Lhs, typename Rhs> class SparseCwiseBinaryOp;
|
||||||
|
@ -59,6 +59,7 @@ class SparseVector
|
|||||||
EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseVector)
|
EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseVector)
|
||||||
EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)
|
EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)
|
||||||
EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)
|
EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)
|
||||||
|
// EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, =)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
public:
|
public:
|
||||||
@ -68,6 +69,9 @@ class SparseVector
|
|||||||
|
|
||||||
CompressedStorage<Scalar> m_data;
|
CompressedStorage<Scalar> m_data;
|
||||||
int m_size;
|
int m_size;
|
||||||
|
|
||||||
|
CompressedStorage<Scalar>& _data() { return m_data; }
|
||||||
|
CompressedStorage<Scalar>& _data() const { return m_data; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -198,6 +202,13 @@ class SparseVector
|
|||||||
{
|
{
|
||||||
*this = other.derived();
|
*this = other.derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
inline SparseVector(const SparseMatrixBase<OtherDerived>& other)
|
||||||
|
: m_size(0)
|
||||||
|
{
|
||||||
|
*this = other.derived();
|
||||||
|
}
|
||||||
|
|
||||||
inline SparseVector(const SparseVector& other)
|
inline SparseVector(const SparseVector& other)
|
||||||
: m_size(0)
|
: m_size(0)
|
||||||
@ -225,9 +236,12 @@ class SparseVector
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
// inline SparseVector& operator=(const MatrixBase<OtherDerived>& other)
|
inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other)
|
||||||
// {
|
{
|
||||||
|
return Base::operator=(other);
|
||||||
|
}
|
||||||
|
|
||||||
// const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
|
// const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
|
||||||
// if (needToTranspose)
|
// if (needToTranspose)
|
||||||
// {
|
// {
|
||||||
|
@ -254,6 +254,24 @@ template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& re
|
|||||||
int j1 = ei_random(0,rows-1);
|
int j1 = ei_random(0,rows-1);
|
||||||
VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0));
|
VERIFY_IS_APPROX(m2.innerVector(j0), refMat2.col(j0));
|
||||||
VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1));
|
VERIFY_IS_APPROX(m2.innerVector(j0)+m2.innerVector(j1), refMat2.col(j0)+refMat2.col(j1));
|
||||||
|
//m2.innerVector(j0) = 2*m2.innerVector(j1);
|
||||||
|
//refMat2.col(j0) = 2*refMat2.col(j1);
|
||||||
|
//VERIFY_IS_APPROX(m2, refMat2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test innerVectors()
|
||||||
|
{
|
||||||
|
DenseMatrix refMat2 = DenseMatrix::Zero(rows, rows);
|
||||||
|
SparseMatrixType m2(rows, rows);
|
||||||
|
initSparse<Scalar>(density, refMat2, m2);
|
||||||
|
int j0 = ei_random(0,rows-2);
|
||||||
|
int j1 = ei_random(0,rows-2);
|
||||||
|
int n0 = ei_random<int>(1,rows-std::max(j0,j1));
|
||||||
|
VERIFY_IS_APPROX(m2.innerVectors(j0,n0), refMat2.block(0,j0,rows,n0));
|
||||||
|
VERIFY_IS_APPROX(m2.innerVectors(j0,n0)+m2.innerVectors(j1,n0),
|
||||||
|
refMat2.block(0,j0,rows,n0)+refMat2.block(0,j1,rows,n0));
|
||||||
|
//m2.innerVectors(j0,n0) = m2.innerVectors(j0,n0) + m2.innerVectors(j1,n0);
|
||||||
|
//refMat2.block(0,j0,rows,n0) = refMat2.block(0,j0,rows,n0) + refMat2.block(0,j1,rows,n0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// test transpose
|
// test transpose
|
||||||
|
Loading…
x
Reference in New Issue
Block a user