gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:00 25 4
gpt4 key购买 nike

Scipy documentation for 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 函数应该如何知道要积分多少维度才能使用正确数量的参数?

如果我修改一般使用的c函数documentation到:

#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 上,我得到一个介于 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

最佳答案

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

请注意,将所有变量压入堆栈和从堆栈中取出它们都是经常执行的高成本操作,并且可以通过这种方式避免。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com