我不能让scipy.integrate.nquad使用cffi函数。 我也找不到这个在线的例子。
假设我的test.py中有一个简单的c函数
ffibuilder.set_source("_test",
r""" #include <math.h>
double test(int n, double* xx) {
return xx[0]*xx[1];
}
""")
我试图将它集成到第二个文件test_cffi.py中,如此
from _test import ffi, lib
from scipy.integrate import nquad
xx = ffi.new("double[]",2)
xx[0] = 1
xx[1] = 2
# This works.
print(lib.test(2,xx))
# This I can't make to work
print(nquad(lib.test3,[[0,1],[0,1]],args=(2,)))
我应该在上一行做什么才能使整合工作? Scipy文档说函数签名必须是双f(int,double *)。
答案 0 :(得分:1)
该文档讨论了如何接受 ctypes 函数,它可能是nquad()
内的特殊内容。它没有提及 cffi 函数,这意味着没有特别的支持。
您可以尝试获取C级函数的地址并将其手动包装在ctypes函数中,以便nquad()
再次打开它并直接调用C函数:
raw_addr = int(ffi.cast("intptr_t", ffi.addressof(lib, "test")))
CF = ctypes.CFUNCTYPE(ctypes.c_double,
ctypes.c_int, ctypes.POINTER(ctypes.c_double))
wrapper_function = CF(raw_addr)