首页 > 解决方案 > Cython/Armadillo 错误:scipy.sparse.csc_matrix 到 SpMat 的转换

问题描述

我目前正在用 Cython 包装 Armadillo 库,并且在通过 Cython 将 Python 中的 scipy.sparse.csc_matrix 转换为来自 Armadillo 的稀疏矩阵类时遇到了一些麻烦。

这样做的功能实际上是这样的:

cdef inline SpMat[double] * sp_to_spmatp(X):
    cdef np.ndarray[int, ndim = 1, mode = 'c'] col_ptrs = X.indptr
    cdef np.ndarray[int, ndim = 1, mode = 'c'] row_indices = X.indices
    cdef np.ndarray[double, ndim = 1, mode = 'c'] values = X.data
    cdef SpMat[double] *p_spRes = new SpMat[double](<int*> &row_indices[0], <int*> &col_ptrs[0], <double*> &values[0], X.shape[0], X.shape[1])
    return p_spRes

其中X是 scipyp_spRes的稀疏矩阵和 Armadillo 的稀疏矩阵。

通过构建它,我得到了这个错误:

arma_wrapper.cpp:3418:549: 错误:没有匹配函数调用'arma::SpMat::SpMat(int*, int*, double*, int&, int&)'</p>

随着:

    Armadillo/include/armadillo_bits/SpMat_bones.hpp:103:10: note: candidate: template<class T1, class T2, class T3> arma::SpMat<eT>::SpMat(const arma::Base<long long unsigned int, T1>&, const arma::Base<long long unsigned int, T2>&, const arma::Base<eT, T3>&, arma::uword, arma::uword)
   inline SpMat(const Base<uword,T1>& rowind, const Base<uword,T2>& colptr, const Base<eT,T3>& values, const uword n_rows, const uword n_cols);
          ^~~~~
Armadillo/include/armadillo_bits/SpMat_bones.hpp:103:10: note:   template argument deduction/substitution failed:
arma_wrapper.cpp:3418:549: note:   mismatched types ‘const arma::Base<long long unsigned int, T1>’ and ‘int*’
 ].strides)))), ((double *)(&(*__Pyx_BufPtrCContig1d(__pyx_t_5numpy_double_t *, __pyx_pybuffernd_values.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_values.diminfo[0].strides)))), __pyx_t_10, __pyx_t_11);
                                                                                                                                                                                                                 ^

这让我认为某些类型转换可能不正确。

如果有人确实对此有所了解,将不胜感激。

标签: scipycythonsparse-matrixarmadillo

解决方案


推荐阅读