Jer*_*ias 1 c++ root-framework
我正在使用 ROOT Cern 来求解多变量非线性方程组。对于某些问题,我有 4 个函数和 4 个变量。然而,对于其他人,我需要 20 个函数和 20 个变量。我使用一个名为“WrappedParamFunction”的类来包装函数,然后将包装的函数添加到“GSLMultiRootFinder”来解决它们。该函数是这样包装的:
ROOT::Math::WrappedParamFunction<> g0(&f0, "number of variables", "number of parameters");
Run Code Online (Sandbox Code Playgroud)
因此,我需要在我的void main(){}代码部分之前声明 f0...fi 函数。我以这种方式声明函数:
double f0(const double *x, const double *par){return -par[0]+y[0]*par[1];}
double f1(const double *x, const double *par){return -par[1]+y[1]*par[2];}
.
.
Run Code Online (Sandbox Code Playgroud)
有没有办法在循环内创建这些函数并将它们堆叠在数组中?像这样的东西:
double (*f[20])(const double *x, const double *par);
for(int i=0;i<20;i++){
f[i]= -par[i]+x[i]*par[i+1];
}
Run Code Online (Sandbox Code Playgroud)
这样稍后我就可以用这种方式包装函数:
ROOT::Math::WrappedParamFunction<> g0(f[0], "number of variables", "number of parameters");
Run Code Online (Sandbox Code Playgroud)
f[i]= -par[i]+x[i]*par[i+1];
Run Code Online (Sandbox Code Playgroud)
您无法在运行时生成代码,因此无法完全按照您的要求进行操作。
但是,您可以保存 的值i以供在运行时使用,因此您有一个可调用对象,其中包含i调用者未显式传递的隐藏参数。最简单的例子是
auto f = [i](const double *x, const double *par)
{
return -par[i]+x[i]*par[i+1];
};
Run Code Online (Sandbox Code Playgroud)
但这给了 lambda 一个独特的类型f,所以你不能轻易地拥有它们的数组。
但是你可以写
using Callable = std::function<double, const double *, const double *>;
std::array<Callable, 20> f;
Run Code Online (Sandbox Code Playgroud)
并将 lambda 存储在其中。
不过,我认为您需要使用ROOT::Math::WrappedParamFunction<Callable>它才能工作,因为FuncPtr参数类型不会被删除。
如果无论出于何种原因你确实无法更改WrappedParamFunction类型参数,你可以使用模板生成一个自由函数而不是有状态 lambda - 但它非常丑陋。
编辑 - 我也在考虑写那个版本,但 fabian 抢先了我。请注意,您必须为需要这种处理的每个不同函数写出所有机制,将其包装在宏中,或者将所有内容概括为也采用函数模板参数。