我正在尝试数字地集成一个特别讨厌的类函数,最初我使用的是GSL,但是舍入误差对于我想要的容差来说太大了。经过一个快速谷歌任意精度正交库后,我找到了quadpack++,这似乎做我想要的,但我不能使它工作,特别是我似乎无法传递这种形式的功能:
mpf MyClass::foo( mpf t, const mpf_array& fourier ){
// do stuf
}
作为输入,它希望以这种形式:
template<typename Real, class param_t>
class Function : public FtnBase<Real> {
public:
typedef Real defn_t(Real, param_t*);
defn_t& function_;
param_t* params_;
virtual Real operator() (Real x) {return function_(x, params_); }
Function(defn_t& function) : function_(function), params_(0) {}
Function(defn_t& function, param_t* params) : function_(function), params_(params) {}
~Function() {}
};
我对C ++很陌生,所以它可能很简单,但我已经尝试了指针和std :: bind的每一个组合,我可以想到基于Q1和Q2无济于事。对此有任何帮助,或建议更好的测试&amp;记录任意精度的正交库将不胜感激。
答案 0 :(得分:1)
函数原型必须有两个参数,第二个必须是指针。我不太了解mpf_array
知道它归结为什么。如果它不是指针类型,那么这是一个问题。 (另外一些测试显示,在参数前面const
没有帮助。)
可能更重要的是,它必须是 free 函数,并且不能属于像MyClass
这样的类(除非它是静态函数IIRC)。你的职能部门中是否需要MyClass
的元素?
(根据下面的评论进行编辑)。显示的函数原型需要一个(可能是真实的)类型和一个指针,基本上, all 其他参数,这对你来说不仅需要这个mpf_array的东西,还需要你需要的MyClass对象从中调用它。所以你需要将所有这些参数组合成一个大的东西。
struct helper {
mpf_array foo;
MyClass bob;
}
然后我们可以创建一个中继函数,将其中一个打包为你需要的参数:
mpf relay(mpf t, helper* args) {
return args->bob.actual_function(t, args->foo);
}
然后使用您的fourier
数组和您的实际对象创建一个辅助结构,并将其地址作为第二个参数传递。这里可能应该有一些引用来避免复制,但是我直接在这个框中输入(所以这里也可能有其他错误)。
这是......充其量只是hackish,但无论如何它应该完成这个包的工作。 (我不得不承认我不知道任何更适合的套餐,对不起。)