【发布时间】:2015-08-30 18:42:16
【问题描述】:
正如标题已经暗示的那样,我很难描述我的架构问题,出于同样的原因,搜索也没有结果。我正在编写一个命令行应用程序,旨在获取可以通过最小二乘拟合来拟合物理模型的二维数据。我已经实现了正常工作的 Nelder-Mead 和 Levenberg-Marquardt 例程,即给定一组数据、一个模型和成本函数,它们将优化一组拟合参数。
为此,我想编写一个类来促进优化的抽象功能,独立于将使用的实际模型和成本函数。
class Fit
{
public:
Fit();
~Fit();
run();
private:
std::vector<std::vector<double>> m_data;
std::vector<double> m_parameters;
std::vector<double> m_evaluated;
}
实际的优化方法run()大致如下:
void run()
{
// Set initial guess for parameters
m_parameters = {...};
while(condition) {
double cost_value;
// Evaluate model function for current parameters
(*model)(&m_evaluated, m_data, m_parameters);
(*cost)(&cost_value, m_data, m_evaluated);
if (cost_value < threshold_value)
break;
else
update_parameters(&m_parameters);
}
}
这就是我的问题所在。Fit::run() 方法需要调用 model 和 cost 函数,但事先不知道它们的外观或它们需要什么函数参数。他们在我的示例中采用的参数是从拟合过程中看到的最低限度的必需参数,但可能还有额外的必需参数。
具体的成本函数和模型将在别处定义,但我不知道如何让Fit 类知道它需要调用哪些函数。来自c 我正在考虑函数指针,但我不知道如何最好在c++ 中完成。 Fit 是否应该有一个函数指针成员 m_model 必须在实例化后设置?我只是在这里吐口水。我将如何最好地解决这个问题,这个问题叫什么,以便我可以寻找其他方法?
编辑:更好地了解我正在尝试完成一些伪代码。
// Imagine multiple available functions that all work differently but take some array of parameters
// which is then used to evaluate some function for a set of data values
void model_a(std::vector<double>* y, std::vector<std::vector<double>> data, std::vector<double> p) {
for (int i; i < data[0].size(); ++i)
(*y)[i] = parameters[0] + parameters[1]*data[0][i];
};
void model_b(std::vector<double>* y, std::vector<std::vector<double>> data, std::vector<double> p) {
for (int i; i < data[0].size(); ++i)
(*y)[i] = parameters[0] - pow(data[0][i], parameters[1]);
};
// Assume we have some data
std::vector<std::vector<double>> data = {};
Fit fit = Fit();
fit->set_data(data)
fit->set_model(model_a); // This is what the question is about
fit->run();
// Now we can extract and display the optimized parameter array
std::vector<double> p = fit.parameters();
for (int i; i < p.size(); ++i)
std::cout << p[i] << std::endl;
【问题讨论】:
-
“来自 c 我一直在考虑函数指针,但我不知道如何在 c++ 中最好地做到这一点。” c++ 中的常用方法是
std::function。 -
如果投反对票的人能解释为什么他认为这个问题不值得问,那将非常有帮助
-
我没有投反对票,但原因可能是您的问题实际上有点宽泛,并且您没有提供如此清晰的代码示例来说明您想要实现的目标。
-
我之所以把它保持得相对宽泛是故意的,因为这让我觉得这是一个应该经常发生的特殊问题,我不想用细节来混淆问题。我将编辑一段伪代码,阐明我想要完成的工作
-
“我如何最好地解决这个问题...” 另请注意,这为固执己见的答案留下了空间,这也是题外话。
标签: c++ architecture decoupling loose-coupling