diff --git a/include/eigenpy/scipy-allocator.hpp b/include/eigenpy/scipy-allocator.hpp index 848fd62f0b60b1fd39a42a46a53bb6f5b2591ca1..0f471b896d11df672552b75dcf96480139989353 100644 --- a/include/eigenpy/scipy-allocator.hpp +++ b/include/eigenpy/scipy-allocator.hpp @@ -85,6 +85,9 @@ struct scipy_allocator_impl_sparse_matrix { // scipy_sparse_matrix_type(*bp::make_tuple(0,0),**args); scipy_sparse_matrix = scipy_sparse_matrix_type( Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>(0, 0)); + } else if (mat.nonZeros() == 0) { + scipy_sparse_matrix = + scipy_sparse_matrix_type(bp::make_tuple(mat.rows(), mat.cols())); } else { scipy_sparse_matrix = scipy_sparse_matrix_type(bp::make_tuple( DataVector(data), diff --git a/include/eigenpy/sparse/eigen-from-python.hpp b/include/eigenpy/sparse/eigen-from-python.hpp index f5158a53f2e77cf08b6875e8568a9ee1958729ba..13c20f77972f556f18e2579b8ad1345e756d7e60 100644 --- a/include/eigenpy/sparse/eigen-from-python.hpp +++ b/include/eigenpy/sparse/eigen-from-python.hpp @@ -146,8 +146,15 @@ void eigen_sparse_matrix_from_py_construct( const Eigen::Index m = bp::extract<Eigen::Index>(shape[0]), n = bp::extract<Eigen::Index>(shape[1]), nnz = bp::extract<Eigen::Index>(obj.attr("nnz")); - MapMatOrRefType sparse_map(m, n, nnz, indptr.data(), indices.data(), - data.data()); + + // Handle the specific case of the null matrix + Scalar *data_ptr = nullptr; + StorageIndex *indices_ptr = nullptr; + if (nnz > 0) { + data_ptr = data.data(); + indices_ptr = indices.data(); + } + MapMatOrRefType sparse_map(m, n, nnz, indptr.data(), indices_ptr, data_ptr); new (raw_ptr) MatOrRefType(sparse_map); }