我正在使用C ++ Boost库中的barycentric_rational对存储在矢量中的数据进行插值。矢量填充在一个类中,并且我需要在填充矢量之后执行插值,因此我可以编写访问函数以获取特定点的插值。像这样:
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的代码很复杂。出于相同原因,在单独的公共方法中设置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)我肯定必须有一个更整洁的方式。
请问有人可以提出我所需的方法吗?
答案 0 :(得分:1)
您可以在初始化列表中将其初始化。如果需要使用一些特殊的逻辑来填充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;
};
答案 1 :(得分:1)
另一种解决方案是用空的x和y初始化b,然后为其分配另一个正确的值:
SELECT
t1.meta_value
FROM wp_wpforms_entrymeta AS t1
JOIN wp_wpforms_entrymeta AS t2
ON t1.entry_id = t2.entry_id
WHERE t1.meta_key = 'entries_for_wpforms_field_id_8'
AND t2.meta_value LIKE '%Houd%';