mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-18 14:34:17 +08:00
Fix linear vectorized transversal in linspace (fixes bug #526).
This commit is contained in:
parent
1a056b408d
commit
b4f6aec195
@ -541,8 +541,11 @@ template <typename Scalar, bool RandomAccess> struct linspaced_op_impl;
|
|||||||
// linear access for packet ops:
|
// linear access for packet ops:
|
||||||
// 1) initialization
|
// 1) initialization
|
||||||
// base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])
|
// base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])
|
||||||
// 2) each step
|
// 2) each step (where size is 1 for coeff access or PacketSize for packet access)
|
||||||
// base += [size*step, ..., size*step]
|
// base += [size*step, ..., size*step]
|
||||||
|
//
|
||||||
|
// TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp)
|
||||||
|
// in order to avoid the padd() in operator() ?
|
||||||
template <typename Scalar>
|
template <typename Scalar>
|
||||||
struct linspaced_op_impl<Scalar,false>
|
struct linspaced_op_impl<Scalar,false>
|
||||||
{
|
{
|
||||||
@ -551,10 +554,15 @@ struct linspaced_op_impl<Scalar,false>
|
|||||||
linspaced_op_impl(Scalar low, Scalar step) :
|
linspaced_op_impl(Scalar low, Scalar step) :
|
||||||
m_low(low), m_step(step),
|
m_low(low), m_step(step),
|
||||||
m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)),
|
m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)),
|
||||||
m_base(padd(pset1<Packet>(low),pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {}
|
m_base(padd(pset1<Packet>(low), pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {}
|
||||||
|
|
||||||
template<typename Index>
|
template<typename Index>
|
||||||
EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; }
|
EIGEN_STRONG_INLINE const Scalar operator() (Index i) const
|
||||||
|
{
|
||||||
|
m_base = padd(m_base, pset1<Packet>(m_step));
|
||||||
|
return m_low+i*m_step;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Index>
|
template<typename Index>
|
||||||
EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); }
|
EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); }
|
||||||
|
|
||||||
|
@ -91,6 +91,12 @@ void testVectorType(const VectorType& base)
|
|||||||
scalar.setLinSpaced(1,low,high);
|
scalar.setLinSpaced(1,low,high);
|
||||||
VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) );
|
VERIFY_IS_APPROX( scalar, ScalarMatrix::Constant(high) );
|
||||||
VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) );
|
VERIFY_IS_APPROX( ScalarMatrix::LinSpaced(1,low,high), ScalarMatrix::Constant(high) );
|
||||||
|
|
||||||
|
// regression test for bug 526 (linear vectorized transversal)
|
||||||
|
if (size > 1) {
|
||||||
|
m.tail(size-1).setLinSpaced(low, high);
|
||||||
|
VERIFY_IS_APPROX(m(size-1), high);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType>
|
template<typename MatrixType>
|
||||||
|
Loading…
Reference in New Issue
Block a user