假设我有一个外部库来计算给定函数的最小值,比如最小值。说它的标题给我一个功能
double[] minimizer(ObjFun f)
标题定义
typedef double (*ObjFun)(double x[])
和“minimizer”返回例如二维向量x的函数f的最小值。
现在,我想使用它来最小化参数化函数。我不知道如何在代码中准确地表达这一点,但是如果我最小化二次形式(只是一个愚蠢的例子,我知道这些已经关闭形式最小值)
double quadraticForm(double x[]) {
return x[0]*x[0]*q11 + 2*x[0]*x[1]*q12 + x[1]*x[1]*q22
}
由常数(q11,q12,q22)参数化。我想编写用户可以在运行时输入(q11,q12,q22)的代码,我可以生成一个函数来作为回调给库,并返回最优。
在C中建议的方法是什么?
我对C生锈了,所以询问可行性和最佳实践。我真的想用C / Cython代码来解决这个问题。到目前为止我使用python绑定到库并使用“内部函数”,在python中如何做到这一点非常明显:
def getFunction(q11, q12, q22):
def f(x):
return x[0]*x[0]*q11 + 2*x[0]*x[1]*q12 + x[1]*x[1]*q22
return f
// now submit getFunction(/*user params*/) to the library
我正在试图找出C构造,以便我可以更好地了解创建Cython等价物。
答案 0 :(得分:-1)
标头定义了一个可用作回调函数的原型。我假设你不能/不会改变那个标题。
如果您的功能有更多参数,则无法通过呼叫填写这些参数 您的函数不能被称为回调,以避免未定义的行为或参数中的伪造值 其功能不能作为回调给出;没有额外的参数。
以上意味着你需要放弃"参数化"你的功能。
您的实际目标是以某种方式允许在运行时更改常量/系数。
找到一种不同的方式。想想"动态配置"而不是"参数化"。
即该函数并不总是期望每次调用时的值。它只是访问它们
(这表明配置值比调用函数更少,但不需要它。)
如何强>:
我只能想到一个简单的方法,它非常丑陋和脆弱(例如由于赛车条件,并发访问,重入;你说它,它会伤害你......):
注意:
答案只是分析,以及为什么你不应该尝试参数。
提出的方法不被视为答案的一部分;它比简单更好
我邀请更全面的答案,提出更安全的实施。