5 #ifndef __pinocchio_math_matrix_hpp__ 
    6 #define __pinocchio_math_matrix_hpp__ 
   12 #include <boost/type_traits.hpp> 
   13 #include <Eigen/Dense> 
   18   template<
typename Derived>
 
   19   inline bool hasNaN(
const Eigen::DenseBase<Derived> & 
m)
 
   21     return !((
m.derived().array() == 
m.derived().array()).all());
 
   28       bool value = is_floating_point<typename MatrixLike::Scalar>::value>
 
   35         const Eigen::MatrixBase<MatrixLike> & mat,
 
   36         const RealScalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
 
   38         return mat.isZero(prec);
 
   42     template<
typename MatrixLike>
 
   49         const Eigen::MatrixBase<MatrixLike> & ,
 
   50         const RealScalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
 
   58   template<
typename MatrixLike>
 
   60     const Eigen::MatrixBase<MatrixLike> & 
m,
 
   61     const typename MatrixLike::RealScalar & prec =
 
   62       Eigen::NumTraits<typename MatrixLike::Scalar>::dummy_precision())
 
   67   template<
typename M1, 
typename M2>
 
   70 #if EIGEN_VERSION_AT_LEAST(3, 2, 90) 
   71     typedef typename Eigen::Product<M1, M2> 
type;
 
   73     typedef typename Eigen::ProductReturnType<M1, M2>::Type 
type;
 
   77   template<
typename Scalar, 
typename Matrix>
 
   80 #if EIGEN_VERSION_AT_LEAST(3, 3, 0) 
   81     typedef Eigen::CwiseBinaryOp<
 
   82       EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_, product), _op) < 
Scalar,
 
   86 #elif EIGEN_VERSION_AT_LEAST(3, 2, 90) 
   87     typedef Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, 
const Matrix> 
type;
 
   89     typedef const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, 
const Matrix>
 
   94   template<
typename Matrix, 
typename Scalar>
 
   97 #if EIGEN_VERSION_AT_LEAST(3, 3, 0) 
   98     typedef Eigen::CwiseBinaryOp<
 
   99       EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_, product), _op) <
 
  104 #elif EIGEN_VERSION_AT_LEAST(3, 2, 90) 
  105     typedef Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, 
const Matrix> 
type;
 
  107     typedef const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, 
const Matrix>
 
  123         const Eigen::MatrixBase<MatrixLike> & mat,
 
  124         const RealScalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
 
  126         return mat.isUnitary(prec);
 
  130     template<
typename MatrixLike>
 
  137         const Eigen::MatrixBase<MatrixLike> & ,
 
  138         const RealScalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
 
  154   template<
typename MatrixLike>
 
  156     const Eigen::MatrixBase<MatrixLike> & mat,
 
  157     const typename MatrixLike::RealScalar & prec =
 
  158       Eigen::NumTraits<typename MatrixLike::Scalar>::dummy_precision())
 
  167       bool value = is_floating_point<typename VectorLike::Scalar>::value>
 
  174         const Eigen::MatrixBase<VectorLike> & vec,
 
  175         const RealScalar & prec = Eigen::NumTraits<RealScalar>::dummy_precision())
 
  181     template<
typename VectorLike>
 
  188         const Eigen::MatrixBase<VectorLike> & ,
 
  189         const RealScalar & prec = Eigen::NumTraits<RealScalar>::dummy_precision())
 
  205   template<
typename VectorLike>
 
  207     const Eigen::MatrixBase<VectorLike> & vec,
 
  208     const typename VectorLike::RealScalar & prec =
 
  209       Eigen::NumTraits<typename VectorLike::Scalar>::dummy_precision())
 
  211     EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorLike);
 
  219       bool value = is_floating_point<typename VectorLike::Scalar>::value>
 
  222       static void run(
const Eigen::MatrixBase<VectorLike> & vec)
 
  224         return vec.const_cast_derived().normalize();
 
  228     template<
typename VectorLike>
 
  231       static void run(
const Eigen::MatrixBase<VectorLike> & vec)
 
  233         using namespace internal;
 
  234         typedef typename VectorLike::RealScalar RealScalar;
 
  236         const RealScalar z = 
vec.squaredNorm();
 
  238         vec.const_cast_derived() /= sqrt_z;
 
  248   template<
typename VectorLike>
 
  249   inline void normalize(
const Eigen::MatrixBase<VectorLike> & vec)
 
  251     EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorLike);
 
  257     template<
typename Scalar>
 
  260       template<
typename MatrixIn, 
typename MatrixOut>
 
  262       run(
const Eigen::MatrixBase<MatrixIn> & m_in, 
const Eigen::MatrixBase<MatrixOut> & dest)
 
  265         dest_.noalias() = m_in.inverse();
 
  271   template<
typename MatrixIn, 
typename MatrixOut>
 
  273   inverse(
const Eigen::MatrixBase<MatrixIn> & m_in, 
const Eigen::MatrixBase<MatrixOut> & dest)
 
  282 #endif // #ifndef __pinocchio_math_matrix_hpp__