将对象信息传递给成本函数

时间:2012-01-30 18:16:09

标签: c++ object function-pointers nonlinear-optimization

这是问题所在。我使用minpack进行非线性优化。成本函数具有以下特征:

void cost_function(const int* n, const int* m,const double *p, double *x, int* iflag)

n - 初始点的大小 m - 函数向量的大小 p - 初始点 x - 函数向量

我有循环,我遍历对象数组。每个对象都包含优化函数的输入信息。

for(int counter = 0; i < num_of_objects; ++counter)
{
    //get information from object
    //call optimization function
    lmdif1_(cost_function, m, n, initial_point, X, precision, info, iwa, wa, lwa);
}

但是在成本函数中,我需要与当前对象连接的特定值。如果cost函数是一个类成员,那么指针将有错误的类型,并且将该指针传递给lmdif1 _是不可能的。

所以现在我有一个临时解决方案,使用全局对象。

for(int counter = 0; i < num_of_objects; ++counter)
{
    //get information from object
    //call optimization function
    global_obj = object;
    lmdif1_(cost_function, m, n, initial_point, X, precision, info, iwa, wa, lwa);
}

然后,cost_function使用此全局对象来接收所需信息。但这并不好。这个问题的正确解决方案是什么?感谢。

2 个答案:

答案 0 :(得分:2)

如果这些mnfvec数组可以是类成员,您可以使用offsetof宏来恢复类的地址。 (有关如何操作,请阅读this explanation of the non-standard container_of macro

如果它们是动态分配的,那就更难了,但你可以在缓冲区中分配额外的空间,并在实际的数组数据前放置一个指向你的类的指针。

答案 1 :(得分:-1)

您必须使用全局对象。

有可能使用thunk但这些很复杂。