mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-19 08:09:36 +08:00
Make reverseInPlace really work in-place.
This commit is contained in:
parent
20d030f207
commit
dfb674a25e
@ -210,7 +210,26 @@ DenseBase<Derived>::reverse() const
|
|||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline void DenseBase<Derived>::reverseInPlace()
|
inline void DenseBase<Derived>::reverseInPlace()
|
||||||
{
|
{
|
||||||
derived() = derived().reverse().eval();
|
if(cols()>rows())
|
||||||
|
{
|
||||||
|
Index half = cols()/2;
|
||||||
|
leftCols(half).swap(rightCols(half).reverse());
|
||||||
|
if((cols()%2)==1)
|
||||||
|
{
|
||||||
|
Index half2 = rows()/2;
|
||||||
|
col(half).head(half2).swap(col(half).tail(half2).reverse());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Index half = rows()/2;
|
||||||
|
topRows(half).swap(bottomRows(half).reverse());
|
||||||
|
if((rows()%2)==1)
|
||||||
|
{
|
||||||
|
Index half2 = cols()/2;
|
||||||
|
row(half).head(half2).swap(row(half).tail(half2).reverse());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
@ -24,7 +24,7 @@ template<typename MatrixType> void reverse(const MatrixType& m)
|
|||||||
|
|
||||||
// this test relies a lot on Random.h, and there's not much more that we can do
|
// this test relies a lot on Random.h, and there's not much more that we can do
|
||||||
// to test it, hence I consider that we will have tested Random.h
|
// to test it, hence I consider that we will have tested Random.h
|
||||||
MatrixType m1 = MatrixType::Random(rows, cols);
|
MatrixType m1 = MatrixType::Random(rows, cols), m2;
|
||||||
VectorType v1 = VectorType::Random(rows);
|
VectorType v1 = VectorType::Random(rows);
|
||||||
|
|
||||||
MatrixType m1_r = m1.reverse();
|
MatrixType m1_r = m1.reverse();
|
||||||
@ -96,6 +96,18 @@ template<typename MatrixType> void reverse(const MatrixType& m)
|
|||||||
|
|
||||||
m1.reverse()(r, c) = x;
|
m1.reverse()(r, c) = x;
|
||||||
VERIFY_IS_APPROX(x, m1(rows - 1 - r, cols - 1 - c));
|
VERIFY_IS_APPROX(x, m1(rows - 1 - r, cols - 1 - c));
|
||||||
|
|
||||||
|
m2 = m1;
|
||||||
|
m2.reverseInPlace();
|
||||||
|
VERIFY_IS_APPROX(m2,m1.reverse().eval());
|
||||||
|
|
||||||
|
m2 = m1;
|
||||||
|
m2.col(0).reverseInPlace();
|
||||||
|
VERIFY_IS_APPROX(m2.col(0),m1.col(0).reverse().eval());
|
||||||
|
|
||||||
|
m2 = m1;
|
||||||
|
m2.row(0).reverseInPlace();
|
||||||
|
VERIFY_IS_APPROX(m2.row(0),m1.row(0).reverse().eval());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
m1.colwise().reverse()(r, c) = x;
|
m1.colwise().reverse()(r, c) = x;
|
||||||
@ -113,11 +125,11 @@ void test_array_reverse()
|
|||||||
CALL_SUBTEST_2( reverse(Matrix2f()) );
|
CALL_SUBTEST_2( reverse(Matrix2f()) );
|
||||||
CALL_SUBTEST_3( reverse(Matrix4f()) );
|
CALL_SUBTEST_3( reverse(Matrix4f()) );
|
||||||
CALL_SUBTEST_4( reverse(Matrix4d()) );
|
CALL_SUBTEST_4( reverse(Matrix4d()) );
|
||||||
CALL_SUBTEST_5( reverse(MatrixXcf(3, 3)) );
|
CALL_SUBTEST_5( reverse(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_6( reverse(MatrixXi(6, 3)) );
|
CALL_SUBTEST_6( reverse(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_7( reverse(MatrixXcd(20, 20)) );
|
CALL_SUBTEST_7( reverse(MatrixXcd(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_8( reverse(Matrix<float, 100, 100>()) );
|
CALL_SUBTEST_8( reverse(Matrix<float, 100, 100>()) );
|
||||||
CALL_SUBTEST_9( reverse(Matrix<float,Dynamic,Dynamic,RowMajor>(6,3)) );
|
CALL_SUBTEST_9( reverse(Matrix<float,Dynamic,Dynamic,RowMajor>(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
}
|
}
|
||||||
#ifdef EIGEN_TEST_PART_3
|
#ifdef EIGEN_TEST_PART_3
|
||||||
Vector4f x; x << 1, 2, 3, 4;
|
Vector4f x; x << 1, 2, 3, 4;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user