使用LowLevelCallable与scipy quad集成:如何传递user_data?

时间:2018-02-08 14:36:20

标签: python c scipy

所以我遵循reference如何使用LowLevelCallable。问题是,我显然无法像以前那样将参数传递给dblquad函数(这会破坏我想加速的所有代码)。我的c代码如下所示:

#include <math.h>
// This function is f = ax + by
double f (int n, double *x) {
    return 2*(x[2]*x[0]+x[3]*x[1]);
}

然后是python代码

import os, ctypes
from scipy import LowLevelCallable
from scipy.integrate import dblquad

lib = ctypes.CDLL(os.path.abspath('./testlib.so'))
lib.f.restype = ctypes.c_double

lib.f.argtypes = (ctypes.c_int, ctypes.POINTER(ctypes.c_double))

func = LowLevelCallable(lib.f)

for a in [1,2,3]:
    for b in [1,2,3]:
        print(dblquad(func, 0,1, lambda x: 0, lambda y: 1, args = [a,b])[0], a+b)

//编辑:有一个错字。现在它有效。没关系。

1 个答案:

答案 0 :(得分:1)

正如here所述,棘手的是将参数包含在数组x中,即x =(x0,x1,...,xn,t0,t1,...,tm) x0,... xn是坐标。