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
答案 0 :(得分:0)
我阅读了文档(您的第一个链接)。我认为他们所说的是,他们不会调用func(x0, x1, ..., xn, t0, t1, ..., tm)
,而是将所有参数压缩为f(int n, double args[n])
中的计数和数组。
请注意,将所有变量推入堆栈并从堆栈中获取它们都是经常执行的昂贵操作,并且可以通过这种方式避免。
答案 1 :(得分:0)
我在github上的scipy问题中得到了答案:n是double args []的长度,其中包括应该评估函数的坐标以及给予nquad并传递给c函数的任何其他参数。