通过 Pybind11 将 Eigen csr_matrix 导出到 python 而不转换为 scipy.sparse.csc/csr 矩阵

Exporting Eigen csr_matrix to python via Pybind11 without converting to scipy.sparse.csc/csr matrix

我想将特征 csr 稀疏矩阵导出到 python 以便执行基准测试。我很清楚 scipy.sparse csr 矩阵遵循 csr 矩阵的规范格式,而 eigen 具有不同的表示形式,这正是我想要玩的。
但是,当导出本征 csr 矩阵时,pybind11 将其导出为 scipy.sparse 类型,我实际上想避免这种情况。

我尝试了以下方法:

    typedef Eigen::SparseMatrix< double >  TpSpMatrix_csr;

    py::class_<TpSpMatrix_csr> csr_matrix_eigen(m, "csr_matrix_eigen");

    csr_matrix_eigen
    .def(py::init<>()
    , "Default constructor"
    )

    .def(py::init<TpSpMatrix_csr>()
    , "Init with csr matrix"
    , py::arg("A")
     )
    ;

    m.def("csr_test", []( TpSpMatrix_csr& A) { std::cout << "csr!"<< std::endl; }
        , "csr test"
        , py::arg("A").noconvert()
        );

将其导入 ipython 后,我得到以下信息:

In [2]: A = csr_matrix_eigen()

In [3]: csr_test(A)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-77568ef56cf5> in <module>
----> 1 csr_test(A)

TypeError: csr_test(): incompatible function arguments. The following argument types are supported:
    1. (A: scipy.sparse.csc_matrix[numpy.float64]) -> None

Invoked with: <eigen_test.csr_matrix_eigen object at 0x7f9e78265af0>

与将本征稀疏矩阵封装在另一个 class 中相比,是否有更简单的方法来实现此目的?
简而言之,我想在不涉及 scipy.sparse 的情况下公开本征稀疏矩阵。

o.k.,张贴问题似乎有帮助。虽然我现在已经为这个问题苦苦挣扎了一段时间,但只有在发布问题后我才找到解决方案,即我必须包括一个

PYBIND11_MAKE_OPAQUE(TpSpMatrix_csr);

在我的 pybind 接口文件的顶部。 我现在可以根据需要调用我的测试函数。 我希望这可以帮助遇到类似问题的其他人。