diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-03-02 20:09:33 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-03-02 20:09:33 +0100 |
commit | 3109f0e74e9d4d4b16409cbd6de6dc297a6b9e05 (patch) | |
tree | 5acb18b8cc2aa9a229e879a4ab7a8f028d518483 /Eigen/src/Geometry/Quaternion.h | |
parent | ef09ce4552daa4bee80e910f6a1d151e84240a2f (diff) |
Add SSE vectorization of Quaternion::conjugate. Significant speed-up when combined with products like q1*q2.conjugate()
Diffstat (limited to 'Eigen/src/Geometry/Quaternion.h')
-rw-r--r-- | Eigen/src/Geometry/Quaternion.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index e1ad803bb..8c44df699 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h @@ -441,7 +441,7 @@ QuaternionBase<Derived>::operator* (const QuaternionBase<OtherDerived>& other) c YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY) return internal::quat_product<Architecture::Target, Derived, OtherDerived, typename internal::traits<Derived>::Scalar, - internal::traits<Derived>::IsAligned && internal::traits<OtherDerived>::IsAligned>::run(*this, other); + (internal::traits<Derived>::IsAligned && internal::traits<OtherDerived>::IsAligned)?Aligned:Unaligned>::run(*this, other); } /** \sa operator*(Quaternion) */ @@ -646,6 +646,16 @@ inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Der } } +// Generic conjugate of a Quaternion +namespace internal { +template<int Arch, class Derived, typename Scalar, int _Options> struct quat_conj +{ + static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived>& q){ + return Quaternion<Scalar>(q.w(),-q.x(),-q.y(),-q.z()); + } +}; +} + /** \returns the conjugate of the \c *this which is equal to the multiplicative inverse * if the quaternion is normalized. * The conjugate of a quaternion represents the opposite rotation. @@ -656,7 +666,10 @@ template <class Derived> inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::conjugate() const { - return Quaternion<Scalar>(this->w(),-this->x(),-this->y(),-this->z()); + return internal::quat_conj<Architecture::Target, Derived, + typename internal::traits<Derived>::Scalar, + internal::traits<Derived>::IsAligned?Aligned:Unaligned>::run(*this); + } /** \returns the angle (in radian) between two rotations |