mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-12 14:25:16 +08:00
Allow .conservativeResize(rows,cols) on vectors
(grafted from b433fb2857
)
This commit is contained in:
parent
0257cf1cef
commit
f407a86a3f
@ -47,7 +47,10 @@ template<> struct check_rows_cols_for_overflow<Dynamic> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Derived, typename OtherDerived = Derived, bool IsVector = bool(Derived::IsVectorAtCompileTime)> struct conservative_resize_like_impl;
|
template <typename Derived,
|
||||||
|
typename OtherDerived = Derived,
|
||||||
|
bool IsVector = bool(Derived::IsVectorAtCompileTime) && bool(OtherDerived::IsVectorAtCompileTime)>
|
||||||
|
struct conservative_resize_like_impl;
|
||||||
|
|
||||||
template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
|
template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
|
||||||
|
|
||||||
@ -668,8 +671,10 @@ private:
|
|||||||
enum { ThisConstantIsPrivateInPlainObjectBase };
|
enum { ThisConstantIsPrivateInPlainObjectBase };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
template <typename Derived, typename OtherDerived, bool IsVector>
|
template <typename Derived, typename OtherDerived, bool IsVector>
|
||||||
struct internal::conservative_resize_like_impl
|
struct conservative_resize_like_impl
|
||||||
{
|
{
|
||||||
typedef typename Derived::Index Index;
|
typedef typename Derived::Index Index;
|
||||||
static void run(DenseBase<Derived>& _this, Index rows, Index cols)
|
static void run(DenseBase<Derived>& _this, Index rows, Index cols)
|
||||||
@ -729,11 +734,14 @@ struct internal::conservative_resize_like_impl
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace internal {
|
// Here, the specialization for vectors inherits from the general matrix case
|
||||||
|
// to allow calling .conservativeResize(rows,cols) on vectors.
|
||||||
template <typename Derived, typename OtherDerived>
|
template <typename Derived, typename OtherDerived>
|
||||||
struct conservative_resize_like_impl<Derived,OtherDerived,true>
|
struct conservative_resize_like_impl<Derived,OtherDerived,true>
|
||||||
|
: conservative_resize_like_impl<Derived,OtherDerived,false>
|
||||||
{
|
{
|
||||||
|
using conservative_resize_like_impl<Derived,OtherDerived,false>::run;
|
||||||
|
|
||||||
typedef typename Derived::Index Index;
|
typedef typename Derived::Index Index;
|
||||||
static void run(DenseBase<Derived>& _this, Index size)
|
static void run(DenseBase<Derived>& _this, Index size)
|
||||||
{
|
{
|
||||||
|
@ -60,34 +60,51 @@ void run_matrix_tests()
|
|||||||
template <typename Scalar>
|
template <typename Scalar>
|
||||||
void run_vector_tests()
|
void run_vector_tests()
|
||||||
{
|
{
|
||||||
typedef Matrix<Scalar, 1, Eigen::Dynamic> MatrixType;
|
typedef Matrix<Scalar, 1, Eigen::Dynamic> VectorType;
|
||||||
|
|
||||||
MatrixType m, n;
|
VectorType m, n;
|
||||||
|
|
||||||
// boundary cases ...
|
// boundary cases ...
|
||||||
m = n = MatrixType::Random(50);
|
m = n = VectorType::Random(50);
|
||||||
m.conservativeResize(1);
|
m.conservativeResize(1);
|
||||||
VERIFY_IS_APPROX(m, n.segment(0,1));
|
VERIFY_IS_APPROX(m, n.segment(0,1));
|
||||||
|
|
||||||
m = n = MatrixType::Random(50);
|
m = n = VectorType::Random(50);
|
||||||
m.conservativeResize(50);
|
m.conservativeResize(50);
|
||||||
VERIFY_IS_APPROX(m, n.segment(0,50));
|
VERIFY_IS_APPROX(m, n.segment(0,50));
|
||||||
|
|
||||||
|
m = n = VectorType::Random(50);
|
||||||
|
m.conservativeResize(m.rows(),1);
|
||||||
|
VERIFY_IS_APPROX(m, n.segment(0,1));
|
||||||
|
|
||||||
|
m = n = VectorType::Random(50);
|
||||||
|
m.conservativeResize(m.rows(),50);
|
||||||
|
VERIFY_IS_APPROX(m, n.segment(0,50));
|
||||||
|
|
||||||
// random shrinking ...
|
// random shrinking ...
|
||||||
for (int i=0; i<50; ++i)
|
for (int i=0; i<50; ++i)
|
||||||
{
|
{
|
||||||
const int size = internal::random<int>(1,50);
|
const int size = internal::random<int>(1,50);
|
||||||
m = n = MatrixType::Random(50);
|
m = n = VectorType::Random(50);
|
||||||
m.conservativeResize(size);
|
m.conservativeResize(size);
|
||||||
VERIFY_IS_APPROX(m, n.segment(0,size));
|
VERIFY_IS_APPROX(m, n.segment(0,size));
|
||||||
|
|
||||||
|
m = n = VectorType::Random(50);
|
||||||
|
m.conservativeResize(m.rows(), size);
|
||||||
|
VERIFY_IS_APPROX(m, n.segment(0,size));
|
||||||
}
|
}
|
||||||
|
|
||||||
// random growing with zeroing ...
|
// random growing with zeroing ...
|
||||||
for (int i=0; i<50; ++i)
|
for (int i=0; i<50; ++i)
|
||||||
{
|
{
|
||||||
const int size = internal::random<int>(50,100);
|
const int size = internal::random<int>(50,100);
|
||||||
m = n = MatrixType::Random(50);
|
m = n = VectorType::Random(50);
|
||||||
m.conservativeResizeLike(MatrixType::Zero(size));
|
m.conservativeResizeLike(VectorType::Zero(size));
|
||||||
|
VERIFY_IS_APPROX(m.segment(0,50), n);
|
||||||
|
VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );
|
||||||
|
|
||||||
|
m = n = VectorType::Random(50);
|
||||||
|
m.conservativeResizeLike(Matrix<Scalar,Dynamic,Dynamic>::Zero(1,size));
|
||||||
VERIFY_IS_APPROX(m.segment(0,50), n);
|
VERIFY_IS_APPROX(m.segment(0,50), n);
|
||||||
VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );
|
VERIFY( size<=50 || m.segment(50,size-50).sum() == Scalar(0) );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user