1

这是问题所在。我使用 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 使用这个全局对象来接收需要的信息。但这并不好。这个问题的正确解决方案是什么?谢谢。

4

2 回答 2

2

如果那些m, n,fvec数组可以是类成员,您可以使用offsetof宏来恢复类的地址。(有关如何做到这一点,请阅读非标准container_of的说明)

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

于 2012-01-30T18:36:45.183 回答
-1

您将不得不使用全局对象。

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

于 2012-01-30T18:26:37.373 回答