From ef022da28e51632458f92baabb539bf13a221694 Mon Sep 17 00:00:00 2001 From: Hauke Heibel Date: Wed, 7 Mar 2012 15:34:39 +0100 Subject: [PATCH] Fixed setLinSpaced for size==1. --- Eigen/src/Core/CwiseNullaryOp.h | 5 +++++ Eigen/src/Core/Functors.h | 2 +- test/nullary.cpp | 10 ++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Eigen/src/Core/CwiseNullaryOp.h b/Eigen/src/Core/CwiseNullaryOp.h index 0fb2c7bc1..05cc2526d 100644 --- a/Eigen/src/Core/CwiseNullaryOp.h +++ b/Eigen/src/Core/CwiseNullaryOp.h @@ -241,6 +241,8 @@ DenseBase::Constant(const Scalar& value) * assumed to be a(0), a(1), ..., a(size). This assumption allows for better vectorization * and yields faster code than the random access version. * + * When size is set to 1, a vector of length 1 containing 'high' is returned. + * * \only_for_vectors * * Example: \include DenseBase_LinSpaced_seq.cpp @@ -273,6 +275,7 @@ DenseBase::LinSpaced(Sequential_t, const Scalar& low, const Scalar& hig * \brief Sets a linearly space vector. * * The function generates 'size' equally spaced values in the closed interval [low,high]. + * When size is set to 1, a vector of length 1 containing 'high' is returned. * * \only_for_vectors * @@ -384,6 +387,7 @@ PlainObjectBase::setConstant(Index rows, Index cols, const Scalar& valu * \brief Sets a linearly space vector. * * The function generates 'size' equally spaced values in the closed interval [low,high]. + * When size is set to 1, a vector of length 1 containing 'high' is returned. * * \only_for_vectors * @@ -403,6 +407,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase::setLinSpaced(Index size, const * \brief Sets a linearly space vector. * * The function fill *this with equally spaced values in the closed interval [low,high]. + * When size is set to 1, a vector of length 1 containing 'high' is returned. * * \only_for_vectors * diff --git a/Eigen/src/Core/Functors.h b/Eigen/src/Core/Functors.h index cbda77c2d..1d641b19f 100644 --- a/Eigen/src/Core/Functors.h +++ b/Eigen/src/Core/Functors.h @@ -628,7 +628,7 @@ template struct functor_traits< linspaced_o template struct linspaced_op { typedef typename packet_traits::type Packet; - linspaced_op(Scalar low, Scalar high, int num_steps) : impl(low, (high-low)/(num_steps-1)) {} + linspaced_op(Scalar low, Scalar high, int num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? 1 : (high-low)/(num_steps-1))) {} template EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); } diff --git a/test/nullary.cpp b/test/nullary.cpp index 0df15c081..501b579b0 100644 --- a/test/nullary.cpp +++ b/test/nullary.cpp @@ -76,8 +76,8 @@ void testVectorType(const VectorType& base) VERIFY( (MatrixXd(RowVectorXd::LinSpaced(3, 0, 1)) - RowVector3d(0, 0.5, 1)).norm() < std::numeric_limits::epsilon() ); // These guys sometimes fail! This is not good. Any ideas how to fix them!? -// VERIFY( m(m.size()-1) == high ); -// VERIFY( m(0) == low ); + //VERIFY( m(m.size()-1) == high ); + //VERIFY( m(0) == low ); // sequential access version m = VectorType::LinSpaced(Sequential,size,low,high); @@ -97,6 +97,12 @@ void testVectorType(const VectorType& base) Matrix size_changer(size+50); size_changer.setLinSpaced(size,low,high); VERIFY( size_changer.size() == size ); + + typedef Matrix ScalarMatrix; + ScalarMatrix scalar; + scalar.setLinSpaced(1,low,high); + VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) ); + VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) ); } template