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

Passing object information to cost function

本文关键字:函数 对象 信息      更新时间:2023-10-16

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

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

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

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

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);
}

但在成本函数中,我需要与当前对象相关的特定值。如果代价函数是类成员,那么指针的类型将错误,并且不可能将此指针传递给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使用这个全局对象来接收所需的信息。但这并不好。这个问题的正确解决方案是什么?谢谢

如果这些mnfvec数组可以是类成员,则可以使用offsetof宏来恢复类的地址。(关于如何做到这一点,请阅读非标准container_of宏的解释)

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