c++ - 很难从 C++ boost 库中获取 barycentric_rational 以按照我需要的方式工作

标签 c++ boost interpolation

我正在使用 C++ Boost 库中的 barycentric_rational 对存储在 vector 中的数据进行插值。 vector 填充在一个类中,我需要在填充 vector 后执行插值,因此我可以编写一个访问函数来获取特定点的插值。像这样:

class V{
public:
    V(/* some arguments */){

        //populate x and y

        b=barycentric_rational<double>(x.data(),y.data(),x.size());
    }

    double psi(double r){
         return b(r);
    }

private:
   std::vector<double> x,y;
   barycentric_rational<double> b;  
};

我收到错误信息:

error: no matching function for call to    ‘boost::math::barycentric_rational<double>::barycentric_rational()

我想我收到此消息是因为 b 需要在初始化列表中初始化,但在我的应用程序中填充 x 和 y 的代码很复杂。出于同样的原因,在单独的公共(public)方法中设置 x 和 y 也不起作用。

我尝试了以下解决方案:

class V{
public:
    V(/* some arguments */):b(nullptr){

        //populate x and y

        b=new barycentric_rational<double>(x.data(),y.data(),x.size());
    }

    ~V(){
          delete b;
     }

    double psi(double r){
         return b->operator()(r);
    }

private:
   std::vector<double> x,y;
   barycentric_rational<double> *b; 
};

这似乎有效。但是,我不喜欢它有两个原因:a) 我正在使用原始指针,最终我需要能够使用复制和赋值运算符,这会给我带来麻烦,并且 b) 我确信必须有一个更简洁的方法。

有人可以建议一种做我需要的方法吗?

最佳答案

你可以在初始化列表中初始化它。如果你需要使用一些特殊的逻辑来填充 x 和 y,你可以在单独的方法中完成。

class V{
public:
    V(/* some arguments */)
    : x(populateX()),  y(populateY()), b(x.data(),y.data(),x.size())
    {
    }

    std::vector<double> populateX() {
    }
    std::vector<double> populateY() {
    }

    double psi(double r){
         return b(r);
    }

private:
   std::vector<double> x,y;
   barycentric_rational<double> b;  
};

如果填充 x 和 y 的代码太复杂,无法单独完成 x 和 y 的初始化,那么您可以将其移至单独的类:

struct XY {
    XY(/* some args */) {
        //init x and y
    }
    std::vector<double> x;
    std::vector<double> y;
};
class V{
public:
    V(/* some arguments */)
    : xy(/*some args */), b(xy.x.data(),xy.y.data(),xy.x.size())
    {
    }

    double psi(double r){
         return b(r);
    }

private:
   XY xy;
   barycentric_rational<double> b;  
};

关于c++ - 很难从 C++ boost 库中获取 barycentric_rational 以按照我需要的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54354539/

相关文章:

c++ - 回复:使用 boost::make_transform_iterator 进行引用访问

c++ - 如何在 C++ 中的 boost::future 中添加回调

algorithm - 如果不是双线性插值,这是什么技术?

c++ - 最短路径与最小生成树的结合

c++ - 选择连接到一个顶点的所有边和顶点的算法

c++ - 如何在 Windows C++ 上分离线程

mysql - 在 SQL 中插入多系列数据

MATLAB - 如何(优雅地)对矩阵进行插值?

c++ - Win32 - 将文本附加到编辑控件

c++ - win32平台下音乐音效播放不了? (cocos2d-x)