diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-07-19 13:03:23 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-07-19 13:03:23 +0000 |
commit | 05ad0834676b7f375df7fd33d90a7db871787330 (patch) | |
tree | 762654dac952a2abb928ec685c7009e95fa67c99 /Eigen/src/Core | |
parent | 7245c63067c69dcaac036ef9045c84ed1401c12d (diff) |
Added MatrixBase::Unit*() static function to easily create unit/basis vectors.
Removed EulerAngles, addes typdefs for Quaternion and AngleAxis,
and added automatic conversions from Quaternion/AngleAxis to Matrix3 such that:
Matrix3f m = AngleAxisf(0.2,Vector3f::UnitX) * AngleAxisf(0.2,Vector3f::UnitY);
just works.
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r-- | Eigen/src/Core/CwiseNullaryOp.h | 84 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 21 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 1 | ||||
-rw-r--r-- | Eigen/src/Core/util/Macros.h | 1 |
4 files changed, 96 insertions, 11 deletions
diff --git a/Eigen/src/Core/CwiseNullaryOp.h b/Eigen/src/Core/CwiseNullaryOp.h index 167993e02..3cf9070e2 100644 --- a/Eigen/src/Core/CwiseNullaryOp.h +++ b/Eigen/src/Core/CwiseNullaryOp.h @@ -43,13 +43,13 @@ template<typename NullaryOp, typename MatrixType> struct ei_traits<CwiseNullaryOp<NullaryOp, MatrixType> > { - typedef typename MatrixType::Scalar Scalar; + typedef typename ei_traits<MatrixType>::Scalar Scalar; enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - Flags = (MatrixType::Flags + RowsAtCompileTime = ei_traits<MatrixType>::RowsAtCompileTime, + ColsAtCompileTime = ei_traits<MatrixType>::ColsAtCompileTime, + MaxRowsAtCompileTime = ei_traits<MatrixType>::MaxRowsAtCompileTime, + MaxColsAtCompileTime = ei_traits<MatrixType>::MaxColsAtCompileTime, + Flags = (ei_traits<MatrixType>::Flags & ( HereditaryBits | (ei_functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0) | (ei_functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0))) @@ -453,7 +453,7 @@ Derived& MatrixBase<Derived>::setOnes() * \sa identity(), setIdentity(), isIdentity() */ template<typename Derived> -inline const CwiseNullaryOp<ei_scalar_identity_op<typename ei_traits<Derived>::Scalar>, Derived> +inline const typename MatrixBase<Derived>::IdentityReturnType MatrixBase<Derived>::identity(int rows, int cols) { return NullaryExpr(rows, cols, ei_scalar_identity_op<Scalar>()); @@ -470,7 +470,7 @@ MatrixBase<Derived>::identity(int rows, int cols) * \sa identity(int,int), setIdentity(), isIdentity() */ template<typename Derived> -inline const CwiseNullaryOp<ei_scalar_identity_op<typename ei_traits<Derived>::Scalar>, Derived> +inline const typename MatrixBase<Derived>::IdentityReturnType MatrixBase<Derived>::identity() { EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) @@ -522,4 +522,72 @@ inline Derived& MatrixBase<Derived>::setIdentity() return *this = identity(rows(), cols()); } +/** \returns an expression of the i-th unit (basis) vector. + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(int size, int i) +{ + EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); + return BasisReturnType(SquareMatrixType::identity(size,size), i); +} + +/** \returns an expression of the i-th unit (basis) vector. + * + * \only_for_vectors + * + * This variant is for fixed-size vector only. + * + * \sa MatrixBase::Unit(int,int), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(int i) +{ + EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); + return BasisReturnType(SquareMatrixType::identity(),i); +} + +/** \returns an expression of the X axis unit vector (1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX() +{ return Derived::Unit(0); } + +/** \returns an expression of the Y axis unit vector (0,1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY() +{ return Derived::Unit(1); } + +/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ() +{ return Derived::Unit(2); } + +/** \returns an expression of the W axis unit vector (0,0,0,1) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW() +{ return Derived::Unit(3); } + #endif // EIGEN_CWISE_NULLARY_OP_H diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index cf6a937d1..c6ea5f14f 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -148,6 +148,10 @@ template<typename Derived> class MatrixBase */ typedef typename NumTraits<Scalar>::Real RealScalar; + /** type of the equivalent square matrix */ + typedef Matrix<Scalar,EIGEN_ENUM_MAX(RowsAtCompileTime,ColsAtCompileTime), + EIGEN_ENUM_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType; + /** \returns the number of rows. \sa cols(), RowsAtCompileTime */ inline int rows() const { return derived().rows(); } /** \returns the number of columns. \sa row(), ColsAtCompileTime*/ @@ -193,7 +197,14 @@ template<typename Derived> class MatrixBase /** the return type of MatrixBase::adjoint() */ typedef Transpose<NestByValue<typename ei_unref<ConjugateReturnType>::type> > AdjointReturnType; + /** the return type of MatrixBase::eigenvalues() */ typedef Matrix<typename NumTraits<typename ei_traits<Derived>::Scalar>::Real, ei_traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType; + /** the return type of identity */ + typedef CwiseNullaryOp<ei_scalar_identity_op<Scalar>,Derived> IdentityReturnType; + /** the return type of unit vectors */ + typedef Block<CwiseNullaryOp<ei_scalar_identity_op<Scalar>, SquareMatrixType>, + ei_traits<Derived>::RowsAtCompileTime, + ei_traits<Derived>::ColsAtCompileTime> BasisReturnType; /** Copies \a other into *this. \returns a reference to *this. */ @@ -391,8 +402,14 @@ template<typename Derived> class MatrixBase static const ConstantReturnType ones(int rows, int cols); static const ConstantReturnType ones(int size); static const ConstantReturnType ones(); - static const CwiseNullaryOp<ei_scalar_identity_op<Scalar>,Derived> identity(); - static const CwiseNullaryOp<ei_scalar_identity_op<Scalar>,Derived> identity(int rows, int cols); + static const IdentityReturnType identity(); + static const IdentityReturnType identity(int rows, int cols); + static const BasisReturnType Unit(int size, int i); + static const BasisReturnType Unit(int i); + static const BasisReturnType UnitX(); + static const BasisReturnType UnitY(); + static const BasisReturnType UnitZ(); + static const BasisReturnType UnitW(); const DiagonalMatrix<Derived> asDiagonal() const; diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index beda186f6..0246b43cc 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -102,7 +102,6 @@ template<typename Lhs, typename Rhs> class Cross; template<typename Scalar> class Quaternion; template<typename Scalar> class Rotation2D; template<typename Scalar> class AngleAxis; -template<typename Scalar> class EulerAngles; template<typename Scalar,int Dim> class Transform; #endif // EIGEN_FORWARDDECLARATIONS_H diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 9c013f6d1..eaa5df27f 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -151,5 +151,6 @@ _EIGEN_GENERIC_PUBLIC_INTERFACE(Derived, Eigen::MatrixBase<Derived>) \ friend class Eigen::MatrixBase<Derived>; #define EIGEN_ENUM_MIN(a,b) (((int)a <= (int)b) ? (int)a : (int)b) +#define EIGEN_ENUM_MAX(a,b) (((int)a >= (int)b) ? (int)a : (int)b) #endif // EIGEN_MACROS_H |