mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-01 23:24:06 +08:00
Sparse move
This commit is contained in:
parent
c8d368bdaf
commit
7b5d32b7c9
@ -788,8 +788,11 @@ class SparseMatrix : public SparseCompressedBase<SparseMatrix<Scalar_, Options_,
|
|||||||
Base::operator=(other);
|
Base::operator=(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline SparseMatrix(SparseMatrix&& other)
|
/** Move constructor */
|
||||||
: Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0) {
|
inline SparseMatrix(SparseMatrix&& other) : SparseMatrix() { this->swap(other); }
|
||||||
|
|
||||||
|
template <typename OtherDerived>
|
||||||
|
inline SparseMatrix(SparseCompressedBase<OtherDerived>&& other) : SparseMatrix() {
|
||||||
*this = other.derived().markAsRValue();
|
*this = other.derived().markAsRValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -857,7 +860,10 @@ class SparseMatrix : public SparseCompressedBase<SparseMatrix<Scalar_, Options_,
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline SparseMatrix& operator=(SparseMatrix&& other) { return *this = other.derived().markAsRValue(); }
|
inline SparseMatrix& operator=(SparseMatrix&& other) {
|
||||||
|
this->swap(other);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||||
template <typename OtherDerived>
|
template <typename OtherDerived>
|
||||||
@ -872,6 +878,12 @@ class SparseMatrix : public SparseCompressedBase<SparseMatrix<Scalar_, Options_,
|
|||||||
template <typename OtherDerived>
|
template <typename OtherDerived>
|
||||||
EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);
|
EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);
|
||||||
|
|
||||||
|
template <typename OtherDerived>
|
||||||
|
inline SparseMatrix& operator=(SparseCompressedBase<OtherDerived>&& other) {
|
||||||
|
*this = other.derived().markAsRValue();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef EIGEN_NO_IO
|
#ifndef EIGEN_NO_IO
|
||||||
friend std::ostream& operator<<(std::ostream& s, const SparseMatrix& m) {
|
friend std::ostream& operator<<(std::ostream& s, const SparseMatrix& m) {
|
||||||
EIGEN_DBG_SPARSE(
|
EIGEN_DBG_SPARSE(
|
||||||
|
@ -304,6 +304,24 @@ class SparseVector : public SparseCompressedBase<SparseVector<Scalar_, Options_,
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline SparseVector(SparseVector&& other) : SparseVector() { this->swap(other); }
|
||||||
|
|
||||||
|
template <typename OtherDerived>
|
||||||
|
inline SparseVector(SparseCompressedBase<OtherDerived>&& other) : SparseVector() {
|
||||||
|
*this = other.derived().markAsRValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SparseVector& operator=(SparseVector&& other) {
|
||||||
|
this->swap(other);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename OtherDerived>
|
||||||
|
inline SparseVector& operator=(SparseCompressedBase<OtherDerived>&& other) {
|
||||||
|
*this = other.derived().markAsRValue();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||||
template <typename Lhs, typename Rhs>
|
template <typename Lhs, typename Rhs>
|
||||||
inline SparseVector& operator=(const SparseSparseProduct<Lhs, Rhs>& product) {
|
inline SparseVector& operator=(const SparseSparseProduct<Lhs, Rhs>& product) {
|
||||||
|
@ -39,7 +39,7 @@ void sparse_basic(const SparseMatrixType& ref) {
|
|||||||
typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
|
typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
|
||||||
typedef Matrix<Scalar, Dynamic, 1> DenseVector;
|
typedef Matrix<Scalar, Dynamic, 1> DenseVector;
|
||||||
typedef Matrix<Scalar, Dynamic, Dynamic, SparseMatrixType::IsRowMajor ? RowMajor : ColMajor> CompatibleDenseMatrix;
|
typedef Matrix<Scalar, Dynamic, Dynamic, SparseMatrixType::IsRowMajor ? RowMajor : ColMajor> CompatibleDenseMatrix;
|
||||||
Scalar eps = 1e-6;
|
Scalar eps = Scalar(1e-6);
|
||||||
|
|
||||||
Scalar s1 = internal::random<Scalar>();
|
Scalar s1 = internal::random<Scalar>();
|
||||||
{
|
{
|
||||||
@ -948,6 +948,27 @@ void sparse_basic(const SparseMatrixType& ref) {
|
|||||||
SparseMatrixType m2(rows, 0);
|
SparseMatrixType m2(rows, 0);
|
||||||
m2.reserve(ArrayXi::Constant(m2.outerSize(), 1));
|
m2.reserve(ArrayXi::Constant(m2.outerSize(), 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test move
|
||||||
|
{
|
||||||
|
using TransposedType = SparseMatrix<Scalar, SparseMatrixType::IsRowMajor ? ColMajor : RowMajor,
|
||||||
|
typename SparseMatrixType::StorageIndex>;
|
||||||
|
DenseMatrix refMat1 = DenseMatrix::Random(rows, cols);
|
||||||
|
SparseMatrixType m1(rows, cols);
|
||||||
|
initSparse<Scalar>(density, refMat1, m1);
|
||||||
|
// test move ctor
|
||||||
|
SparseMatrixType m2(std::move(m1));
|
||||||
|
VERIFY_IS_APPROX(m2, refMat1);
|
||||||
|
// test move assignment
|
||||||
|
m1 = std::move(m2);
|
||||||
|
VERIFY_IS_APPROX(m1, refMat1);
|
||||||
|
// test move ctor (SparseMatrixBase)
|
||||||
|
TransposedType m3(std::move(m1.transpose()));
|
||||||
|
VERIFY_IS_APPROX(m3, refMat1.transpose());
|
||||||
|
// test move assignment (SparseMatrixBase)
|
||||||
|
m2 = std::move(m3.transpose());
|
||||||
|
VERIFY_IS_APPROX(m2, refMat1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename SparseMatrixType>
|
template <typename SparseMatrixType>
|
||||||
@ -994,7 +1015,7 @@ EIGEN_DECLARE_TEST(sparse_basic) {
|
|||||||
g_dense_op_sparse_count = 0; // Suppresses compiler warning.
|
g_dense_op_sparse_count = 0; // Suppresses compiler warning.
|
||||||
for (int i = 0; i < g_repeat; i++) {
|
for (int i = 0; i < g_repeat; i++) {
|
||||||
int r = Eigen::internal::random<int>(1, 200), c = Eigen::internal::random<int>(1, 200);
|
int r = Eigen::internal::random<int>(1, 200), c = Eigen::internal::random<int>(1, 200);
|
||||||
if (Eigen::internal::random<int>(0, 4) == 0) {
|
if (Eigen::internal::random<int>(0, 3) == 0) {
|
||||||
r = c; // check square matrices in 25% of tries
|
r = c; // check square matrices in 25% of tries
|
||||||
}
|
}
|
||||||
EIGEN_UNUSED_VARIABLE(r + c);
|
EIGEN_UNUSED_VARIABLE(r + c);
|
||||||
@ -1011,7 +1032,7 @@ EIGEN_DECLARE_TEST(sparse_basic) {
|
|||||||
|
|
||||||
r = Eigen::internal::random<int>(1, 100);
|
r = Eigen::internal::random<int>(1, 100);
|
||||||
c = Eigen::internal::random<int>(1, 100);
|
c = Eigen::internal::random<int>(1, 100);
|
||||||
if (Eigen::internal::random<int>(0, 4) == 0) {
|
if (Eigen::internal::random<int>(0, 3) == 0) {
|
||||||
r = c; // check square matrices in 25% of tries
|
r = c; // check square matrices in 25% of tries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,6 +108,33 @@ void sparse_vector(int rows, int cols) {
|
|||||||
VERIFY_IS_APPROX(refV3 = v1.transpose(), v1.toDense());
|
VERIFY_IS_APPROX(refV3 = v1.transpose(), v1.toDense());
|
||||||
VERIFY_IS_APPROX(DenseVector(v1), v1.toDense());
|
VERIFY_IS_APPROX(DenseVector(v1), v1.toDense());
|
||||||
|
|
||||||
|
// test move
|
||||||
|
{
|
||||||
|
SparseVectorType v3(std::move(v1));
|
||||||
|
VERIFY_IS_APPROX(v3, refV1);
|
||||||
|
v1 = v3;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SparseVectorType v3;
|
||||||
|
v3 = std::move(v1);
|
||||||
|
VERIFY_IS_APPROX(v3, refV1);
|
||||||
|
v1 = v3;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SparseVectorType v3(std::move(mv1));
|
||||||
|
VERIFY_IS_APPROX(v3, refV1);
|
||||||
|
mv1 = v3;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SparseVectorType v3;
|
||||||
|
v3 = std::move(mv1);
|
||||||
|
VERIFY_IS_APPROX(v3, refV1);
|
||||||
|
mv1 = v3;
|
||||||
|
}
|
||||||
|
|
||||||
// test conservative resize
|
// test conservative resize
|
||||||
{
|
{
|
||||||
std::vector<StorageIndex> inc;
|
std::vector<StorageIndex> inc;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user