我正在使用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/

10-09 07:53