繁体   English   中英

用cython包装double ** c ++函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM