具有可变参数数量的派生类

时间:2016-08-27 20:47:14

标签: c++ function derived-class

我的项目中有这个特定的类结构(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, &parameter2, &parameter3, &parameter4, &parameter6, &parameter7);
}

所以基于用户修复的参数,所以7个参数(2个幂7)是128个组合。现在我的问题是:有没有办法可以提供这个选项并避免为特定实验声明128个不同的派生类这个项目有很多实验。

任何想法将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

只得到100分?

只需创建一个包含100个所选固定参数副本的数组,然后运行优化。 优点是您可以对所有优化使用相同的功能。