[英]Wrap a double** c++ function with cython
我有一个C ++函数,该函数返回double**
精度指针double**
-特别是高维矩阵-我想使用Cython将其包装到某些python代码中。 我该怎么办?
为了简单起见,这里有一个带有double*
指针的函数的示例。
我的C ++ fib.cpp
代码:
double add(double a, double b)
{
return a+b;
}
double p[]= {1,2,3,4};
double* mult(double a)
{
p[0]=p[0]*a;
p[1]=p[1]*a;
return p;
}
然后是fib.hpp
文件:
double add(double a,double b);
double* mult(double a);
然后是pxd文件fib.pxd
:
cdef extern from "fib.hpp":
double add(double a,double b);
double* mult(double a);
最后是pyx文件
# distutils: language = c++
# distutils: sources = fib.cpp
cimport fib
def add(a,b):
return fib.add(a,b)
def mult(a): # dropping these lines
return fib.mult(a) # the code works without the double* function
一切都用相当标准的setup.py
编译:
from distutils.core import setup, Extension
from Cython.Build import cythonize
ext = Extension("fib2cpp",
sources=["fib.pyx", "fib.cpp"],
language="c++")
setup(name="fib",
ext_modules=cythonize(ext))
当我编译代码时:
setup.py build_ext -if
无法将“
double *
”转换为python对象。
当我尝试使用double**
函数时,会出现相同的错误。 我该怎么办?
我找到了针对double *
的解决方案。 首先,文件fib.pxd
是无用的。 然后,我们需要一个新的fib.pyx
文件:
# distutils: language = c++
# distutils: sources = fib.cpp
import numpy as np
cimport numpy as cnp
cdef extern from "fib.hpp":
double fib(int n)
double add (double a, double b)
double* mult(double a)
def make_mult(double a):
cdef double[:] mv = <double[:4]> mult(a) # the 4 stands for
return np.asarray(mv) # the dimension of the array defined in fib.cpp
对于返回nrows * ncols矩阵的函数; 例如double* make_mat(int nrows, int ncols)
,函数make_mult
的第二行必须重写为:
cdef double[:,:] mv=<double[:nrows,:ncols]> make_mat(nrows, ncols)
遗憾的是,如果我有一个函数double** make_mat(int nrows, int ncols)
总是返回一个矩阵,那么先前的代码将double** make_mat(int nrows, int ncols)
错误:
指针基本类型与cython.array基本类型不匹配
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.