我的项目中有这个特定的类结构(C ++ 11使用Visual Studio 2013 for Windows),包括一个基础实验类和许多实验(来自基础实验类的派生类)。每个实验具有不同数量的参数(4到12个参数)。在每个实验中,用户提供参数的某些初始值,并且针对所收集的数据点(大约100个点)的唯一方程组优化这些参数。现在,用户可以选择告诉程序特定参数应该被修复而不是优化。例如,实验#1有7个参数,用户可以选择参数#1和参数#5是固定的,剩下的需要优化。
class Experiment1:public BaseExperiment{
public:
Experiment1(){}
virtual ~Experiment1(){}
private:
double parameter2, parameter3, parameter4, parameter6, parameter7;
}
class Experiment1Case1: public Experiment1{
public:
Experiment1Case1(double x, double y)
: x_(x), y_(y) {}
template <typename T> bool operator()(const T* const parameter2, const T* const parameter3, const T* const parameter4, const T* const parameter6, const T* const parameter7, T* residual) const{
// equation relating all parameters
residual[0] = - T(y) + parameter2[0] + parameter3[0] * sin(parameter6[0])/ parameter1Fixed; //long equation here
return true;
}
void setparameter1(double initialParameter1) { parameter1Fixed = initialparameter1; }
void setparameter5(double initialParameter5) { parameter5Fixed = initialparameter5; }
private:
const double x_;
const double y_;
double parameter1Fixed, parameter5Fixed;
};
在我的主程序中,根据用户修复的参数,我必须使用未修复的参数数量调用特定函数。因此,对于上面的示例,如果用户修复了parameter1和parameter5,则代码将为:
for (size_t i = 0; i < data1.size(); ++i) {
Experiment1Case1 *exp1C1 = new Experiment1Case1(data1[i], data2[i]);
exp1C1->setparameter1(20.0);
exp1C1->setparameter5(290.0);
problem.AddResidualBlock(new AutoDiffCostFunction<Experiment1Case1, 1, 1, 1, 1, 1, 1,>(exp1C1), NULL, ¶meter2, ¶meter3, ¶meter4, ¶meter6, ¶meter7);
}
所以基于用户修复的参数,所以7个参数(2个幂7)是128个组合。现在我的问题是:有没有办法可以提供这个选项并避免为特定实验声明128个不同的派生类这个项目有很多实验。
任何想法将不胜感激。谢谢。
答案 0 :(得分:1)
只得到100分?
只需创建一个包含100个所选固定参数副本的数组,然后运行优化。 优点是您可以对所有优化使用相同的功能。