如何知道nquad调用的C函数中的维数?

时间:2017-03-01 16:28:30

标签: python c scipy

scipy documentation表示nquad表示用于集成的c函数的格式为

f(int n, double args[n])
where n is the number of extra parameters and args is an array of doubles of the additional parameters.

那么为了使用正确数量的args,c函数如何知道要集成多少维度?

如果我将常规documentation中使用的c函数修改为:

#include "stdio.h"
double f(int n, double args[]) {
    (void)args;
    printf("%i\n", n);
    return 0;
}

编译
gcc -fPIC -shared func.c -o func.so

并运行此python程序:

#!/usr/bin/env python3
import ctypes
from scipy.integrate import nquad
lib = ctypes.CDLL('func.so')
func = lib.f
func.restype = ctypes.c_double
func.argtypes = (ctypes.c_int, ctypes.c_double)
print(nquad(func, [[0, 1]]))

对于64位Fedora 25上的n,我获得了32764和32767之间的值,而在32位fedora 25上我得到0.在上面的链接中,c函数不检查n的值,但使用args [0] ... args [2]那么有没有办法知道有多少维度被整合?

致电nquad:

print(nquad(func, [[0, 1]], args = [1,2,3]))
相反,即使n应该不同,也不会改变64位系统上打印的内容。我正在使用

gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
Python 3.5.2
scipy 0.18.0

2 个答案:

答案 0 :(得分:0)

我阅读了文档(您的第一个链接)。我认为他们所说的是,他们不会调用func(x0, x1, ..., xn, t0, t1, ..., tm),而是将所有参数压缩为f(int n, double args[n])中的计数和数组。

请注意,将所有变量推入堆栈并从堆栈中获取它们都是经常执行的昂贵操作,并且可以通过这种方式避免。

答案 1 :(得分:0)

我在github上的scipy问题中得到了答案:n是double args []的长度,其中包括应该评估函数的坐标以及给予nquad并传递给c函数的任何其他参数。