C++ 基于Boost-cpp的二维数据插值

C++ 基于Boost-cpp的二维数据插值,c++,boost,interpolation,C++,Boost,Interpolation,Boost中有许多插值库,但都是一维插值。有没有一种方法可以让它们用于二维插值 默认情况下,对一维使用插值,如下所示 #include <iostream> #include <boost/math/interpolators/cardinal_cubic_b_spline.hpp> #include <vector> int main(int argc, char *argv[]) { //f is the data std::vector<doub

Boost中有许多插值库,但都是一维插值。有没有一种方法可以让它们用于二维插值

默认情况下,对一维使用插值,如下所示

#include <iostream>
#include <boost/math/interpolators/cardinal_cubic_b_spline.hpp>
#include <vector>

int main(int argc, char *argv[])
{
//f is the data
std::vector<double> f{0.01, -0.02, 0.3, 0.8, 1.9, -8.78, -22.6};

//the start of the functions domain
double x0 = 0;

//step size
double dx = 0.01;

boost::math::interpolators::cardinal_cubic_b_spline<double> spline(f.begin(), f.end(), x0, dx);

//find the interpolant at a point
double y = spline(0.055);
std::cout << y << std::endl;
return 0;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
//f是数据
std::向量f{0.01,-0.02,0.3,0.8,1.9,-8.78,-22.6};
//函数域的开始
双x0=0;
//步长
双dx=0.01;
boost::math::interpolators::基数三次b_样条(f.begin(),f.end(),x0,dx);
//在一个点上找到插值
双y=花键(0.055);

std::cout你问这个问题已经有一段时间了,我不知道你是否已经找到了答案,但这里有一种执行二维插值的经典方法

假设在规则网格{x_i,y_j}上定义了一个函数f,其中i-(0,M]和j-(0,N)。您希望为查询点(px,py)插值

步骤1.您可以构造N个1-D插值对象,每行数据一个(共享相同的y-调用这些函数f_j(x))。对所有j进行插值并找到f_j(px),我们称之为FY_j

步骤2.现在你有了另一个一维向量Y_j,j-(0,N)(与列大小相同)。在FY_j(Y_j)上构造一个最终的插值对象,然后插值找到FY_j(py)。你就完成了

如果这让人困惑,看看维基百科上的这张图片是否有帮助。这是针对单个“网格”的。由于样条曲线是一个全局插值,您需要在第一步中涉及所有行,而不是此处显示的2行


Boost中没有2D插值,我个人也不知道如何将一维插值“引导”到2D。我假设您使用单个STL向量将2D数据存储为一个大块(好),而不是向量向量(几乎总是一个更糟糕的选择)。如果是这样,您应该能够使用ALGLIB的
attach_to_ptr
方法在需要调用其函数时创建小型代理ALGLIB数组。