From 9d26d65d4a17f107b3073598310f0bee86b47d3e Mon Sep 17 00:00:00 2001 From: Justin Carpentier <justin.carpentier@inria.fr> Date: Thu, 18 Jul 2019 14:29:55 +0200 Subject: [PATCH] core: improve efficiency of memory mapping from Eigen to Python --- include/eigenpy/details.hpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index 92df398a..73f87f5f 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -18,7 +18,6 @@ #define GET_PY_ARRAY_TYPE(array) PyArray_ObjectType(reinterpret_cast<PyObject *>(array), 0) - namespace eigenpy { template <typename SCALAR> struct NumpyEquivalentType {}; @@ -160,19 +159,38 @@ namespace eigenpy *mat_ptr = MapNumpy<MatType,double>::map(pyArray).template cast<Scalar>(); } - static void convert(Type const & mat , PyArrayObject * pyArray) + /// \brief Copy mat into the Python array using Eigen::Map + static void convert(Type const & mat, PyArrayObject * pyArray) { + if(NumpyEquivalentType<Scalar>::type_code == GET_PY_ARRAY_TYPE(pyArray)) + { + MapNumpy<MatType,Scalar>::map(pyArray) = mat; // no cast needed + return; + } + if(GET_PY_ARRAY_TYPE(pyArray) == NPY_INT) + { MapNumpy<MatType,int>::map(pyArray) = mat.template cast<int>(); + return; + } if(GET_PY_ARRAY_TYPE(pyArray) == NPY_LONG) + { MapNumpy<MatType,long>::map(pyArray) = mat.template cast<long>(); + return; + } if(GET_PY_ARRAY_TYPE(pyArray) == NPY_FLOAT) + { MapNumpy<MatType,float>::map(pyArray) = mat.template cast<float>(); + return; + } if(GET_PY_ARRAY_TYPE(pyArray) == NPY_DOUBLE) + { MapNumpy<MatType,double>::map(pyArray) = mat.template cast<double>(); + return; + } } }; -- GitLab