@@ -66,6 +66,17 @@ namespace eigenpy
6666 }
6767 }
6868 };
69+
70+ template <typename MatType>
71+ bool check_swap (PyArrayObject * pyArray,
72+ const Eigen::MatrixBase<MatType> & mat)
73+ {
74+ if (PyArray_NDIM (pyArray) == 0 ) return false ;
75+ if (mat.rows () == PyArray_DIMS (pyArray)[0 ])
76+ return false ;
77+ else
78+ return true ;
79+ }
6980
7081 template <typename Scalar, typename NewScalar, bool cast_is_valid = FromTypeToType<Scalar,NewScalar>::value >
7182 struct cast_matrix_or_array
@@ -75,10 +86,7 @@ namespace eigenpy
7586 const Eigen::MatrixBase<MatrixOut> & dest)
7687 {
7788 MatrixOut & dest_ = const_cast <MatrixOut &>(dest.derived ());
78- if (dest.rows () == input.rows ())
79- dest_ = input.template cast <NewScalar>();
80- else
81- dest_ = input.transpose ().template cast <NewScalar>();
89+ dest_ = input.template cast <NewScalar>();
8290 }
8391 };
8492
@@ -97,11 +105,11 @@ namespace eigenpy
97105 } // namespace details
98106
99107#define EIGENPY_CAST_FROM_PYARRAY_TO_EIGEN_MATRIX (MatType,Scalar,NewScalar,pyArray,mat ) \
100- details::cast_matrix_or_array<Scalar,NewScalar>::run(NumpyMap<MatType,Scalar>::map(pyArray),mat)
108+ details::cast_matrix_or_array<Scalar,NewScalar>::run(NumpyMap<MatType,Scalar>::map(pyArray,details::check_swap(pyArray,mat) ),mat)
101109
102110#define EIGENPY_CAST_FROM_EIGEN_MATRIX_TO_PYARRAY (MatType,Scalar,NewScalar,mat,pyArray ) \
103- details::cast_matrix_or_array<Scalar,NewScalar>::run(mat,NumpyMap<MatType,NewScalar>::map(pyArray))
104-
111+ details::cast_matrix_or_array<Scalar,NewScalar>::run(mat,NumpyMap<MatType,NewScalar>::map(pyArray,details::check_swap(pyArray,mat) ))
112+
105113 template <typename MatType>
106114 struct EigenAllocator
107115 {
@@ -119,7 +127,7 @@ namespace eigenpy
119127 const int Scalar_type_code = Register::getTypeCode<Scalar>();
120128 if (pyArray_type_code == Scalar_type_code)
121129 {
122- mat = NumpyMap<MatType,Scalar>::map (pyArray); // avoid useless cast
130+ mat = NumpyMap<MatType,Scalar>::map (pyArray, details::check_swap (pyArray,mat) ); // avoid useless cast
123131 return ;
124132 }
125133
@@ -167,11 +175,8 @@ namespace eigenpy
167175
168176 if (pyArray_type_code == Scalar_type_code) // no cast needed
169177 {
170- MapType map_pyArray = NumpyMap<MatType,Scalar>::map (pyArray);
171- if (mat.rows () == map_pyArray.rows ())
172- map_pyArray = mat;
173- else
174- map_pyArray = mat.transpose ();
178+ MapType map_pyArray = NumpyMap<MatType,Scalar>::map (pyArray,details::check_swap (pyArray,mat));
179+ map_pyArray = mat;
175180 return ;
176181 }
177182
@@ -252,7 +257,7 @@ namespace eigenpy
252257 RefType & mat = *reinterpret_cast <RefType*>(raw_ptr);
253258 if (pyArray_type_code == Scalar_type_code)
254259 {
255- mat = NumpyMap<MatType,Scalar>::map (pyArray); // avoid useless cast
260+ mat = NumpyMap<MatType,Scalar>::map (pyArray, details::check_swap (pyArray,mat) ); // avoid useless cast
256261 return ;
257262 }
258263
@@ -346,7 +351,7 @@ namespace eigenpy
346351 MatType & mat = *mat_ptr;
347352 if (pyArray_type_code == Scalar_type_code)
348353 {
349- mat = NumpyMap<MatType,Scalar>::map (pyArray); // avoid useless cast
354+ mat = NumpyMap<MatType,Scalar>::map (pyArray, details::check_swap (pyArray,mat) ); // avoid useless cast
350355 return ;
351356 }
352357
0 commit comments