这是问题所在。我使用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使用此全局对象来接收所需信息。但这并不好。这个问题的正确解决方案是什么?感谢。
答案 0 :(得分:2)
如果这些m
,n
,fvec
数组可以是类成员,您可以使用offsetof
宏来恢复类的地址。 (有关如何操作,请阅读this explanation of the non-standard container_of
macro)
如果它们是动态分配的,那就更难了,但你可以在缓冲区中分配额外的空间,并在实际的数组数据前放置一个指向你的类的指针。
答案 1 :(得分:-1)
您必须使用全局对象。
有可能使用thunk但这些很复杂。