对于nquad,Scipydocumentation表示用于集成的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函数应该如何知道集成了多少维?
如果我将一般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]))

相反,不会更改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])中的一个计数和一个数组”。
请注意,将所有变量推送到堆栈上,以及从堆栈中获取变量,这两种操作在经常执行时都是代价高昂的操作,可以通过这种方式避免。

关于python - 如何知道nquad调用的C函数中的维数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42536982/

10-11 16:57