C++ c++;松耦合函数依赖
正如标题可能已经暗示的那样,我很难描述我的架构问题,出于同样的原因,搜索一直没有结果。我正在编写一个命令行应用程序,旨在接收二维数据,物理模型可以通过最小二乘法拟合。我已经实施了Nelder Mead和Levenberg-Marquardt例程,该例程工作正常,即给定一组数据、模型和成本函数,它们将优化一系列拟合参数 为此,我想编写一个类,它有助于优化的抽象功能,独立于将要使用的实际模型和成本函数C++ c++;松耦合函数依赖,c++,architecture,decoupling,loose-coupling,C++,Architecture,Decoupling,Loose Coupling,正如标题可能已经暗示的那样,我很难描述我的架构问题,出于同样的原因,搜索一直没有结果。我正在编写一个命令行应用程序,旨在接收二维数据,物理模型可以通过最小二乘法拟合。我已经实施了Nelder Mead和Levenberg-Marquardt例程,该例程工作正常,即给定一组数据、模型和成本函数,它们将优化一系列拟合参数 为此,我想编写一个类,它有助于优化的抽象功能,独立于将要使用的实际模型和成本函数 class Fit { public: Fit(); ~Fit(); r
class Fit
{
public:
Fit();
~Fit();
run();
private:
std::vector<std::vector<double>> m_data;
std::vector<double> m_parameters;
std::vector<double> m_evaluated;
}
这就是我的问题所在。Fit::run()
方法需要调用model
和cost
函数,但事先不知道这些函数看起来像什么,也不知道它们需要什么函数参数。在我的示例中,他们采用的参数是从拟合过程中看到的最低必需参数,但可能还有其他必需参数
具体的成本函数和模型将在别处定义,但我不知道如何让类知道它需要调用哪些函数。从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;
//想象多个可用函数,它们都以不同的方式工作,但采用一些参数数组
//然后用于对一组数据值的某个函数求值
void model_a(std::vector*y,std::vector data,std::vector p){
对于(int i;i设置数据(数据)
拟合->设置模型(模型a);//这就是问题所在
fit->run();
//现在我们可以提取并显示优化的参数数组
std::vector p=fit.parameters();
对于(int i;i 对我来说,这听起来像是想要一个提供接口的接口类,或者简单地建立一个类层次结构,其中数据存储在基类中,派生类知道如何计算成本,等等
实际上,有几种方法可以实现这一点——如果希望数据在类中持久化,可以在构建时或稍后在成本模型实例中传入
遗憾的是,我现在不得不匆忙,但稍后会回来查看评论等。来自C我是思维函数指针,但我不知道这是如何最好地在C++中完成的。C++中常用的方法是:如果下沉者能解释为什么他认为这个问题不值得我去投票,我会很有帮助,但原因可能是你的问题实际上有点宽泛,你没有提供一个如此清晰的代码示例来说明你想要实现的目标。我之所以将其相对宽泛,是出于深思熟虑,因为这对我来说是一个应该经常发生的特殊问题,我不想把问题的细节弄得杂乱无章。我将在一段伪代码中进行编辑,这段伪代码将阐明我想要实现的目标“我如何才能最好地实现这一点…”还请注意,这为自以为是的答案留下了空间,这也是离题的。
// 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;