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

问题描述:

SciPy的documentation为nquad规定,用于集成C函数的形式如何知道由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. 

因此,如何C函数应该知道有多少维正被集成,以使用args正确数量的?

如果我修改一般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]])) 

我得到之间的值。 32764和32767在64位fedora 25上的n,而在32位的fedora 25上我得到0.在上面的链接中,c函数on不检查n的值,但使用args [0] ... args [2]所以没有办法知道有多少维被集成?

调用nquad有:

print(nquad(func, [[0, 1]], args = [1,2,3])) 

反而不会改变被印在64位系统,即便N应该是不同的。我正在使用

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

我阅读文档(您的第一个链接)。我觉得他们说的是,这不是调用func(x0, x1, ..., xn, t0, t1, ..., tm),他们“凝聚所有的参数为计数和f(int n, double args[n])的数组。

注意这两个推动所有的变量压入堆栈,并从堆栈中让他们很昂贵操作时经常执行,可以用这种方式避免。

+0

问题是根据他们的文档和我的测试,n只告诉数字的额外参数,而不是维数。 – user1226313

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