Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;松耦合函数依赖_C++_Architecture_Decoupling_Loose Coupling - Fatal编程技术网

C++ c++;松耦合函数依赖

C++ c++;松耦合函数依赖,c++,architecture,decoupling,loose-coupling,C++,Architecture,Decoupling,Loose Coupling,正如标题可能已经暗示的那样,我很难描述我的架构问题,出于同样的原因,搜索一直没有结果。我正在编写一个命令行应用程序,旨在接收二维数据,物理模型可以通过最小二乘法拟合。我已经实施了Nelder Mead和Levenberg-Marquardt例程,该例程工作正常,即给定一组数据、模型和成本函数,它们将优化一系列拟合参数 为此,我想编写一个类,它有助于优化的抽象功能,独立于将要使用的实际模型和成本函数 class Fit { public: Fit(); ~Fit(); r

正如标题可能已经暗示的那样,我很难描述我的架构问题,出于同样的原因,搜索一直没有结果。我正在编写一个命令行应用程序,旨在接收二维数据,物理模型可以通过最小二乘法拟合。我已经实施了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;
}
这就是我的问题所在。
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;