与C ++中的Matlab网格数据等效

And*_* K. 5 c++ matlab interpolation

我正在寻找与Matlab的griddata函数或任何2D全局插值方法等效的C ++。

我有一个使用本征3的C ++代码。我将有一个本征向量,其中将包含x,y和z值,以及两个等效于Matlab中Meshgrid生成的本征矩阵。我想将向量中的z值插值到由Meshgrid等效项定义的网格点上(该网格点将延伸超出原始点的外部,因此需要进行较小的外推)。

我对准确性不太感兴趣-它不需要是完美的。但是,我不能接受NaN作为解决方案-必须在网格上的任何位置计算插值,而不考虑数据间隙。换句话说,留在凸包内不是一种选择。

我不希望从头开始编写插值法,但是如果有人想指出我一个很好的(明确的)菜谱,我会试一试。这并不是最令人讨厌的事情(至少从算法的意义上来说),但是我不想重蹈覆辙。

实际上,我所拥有的是分散的地形位置,我希望定义一个直线网格,该网格名义上遵循地形下方的某个距离,以备后用。一旦有了节点点,我就会好起来的。

到目前为止,我的研究:

这里提出的问题是:C ++中的MATLAB函数产生了一个接近的答案,但不幸的是,该建议并非免费(SciMath)。

我试图理解通用映射工具中使用的插值函数,但感到头疼。

我简要介绍了网格算法库(GrAL)。如果有人发表评论,我将不胜感激。

Eigen有一个不受支持的插值包,但它似乎仅适用于曲线(而不是曲面)。

编辑:VTK具有matplotlib功能。大概必须在其中某处使用插值来进行显示。有人知道这是否可以访问和使用吗?

谢谢。

use*_*934 3

这可能有点晚了,但希望对某人有所帮助。

方法 1.) Octave:如果您来自 Matlab,一种方法是将 gnu Matlab 克隆 Octave 直接嵌入到 C++ 程序中。我对此没有太多经验,但是您可以直接从 cpp 文件调用八度库函数。

例如,请参见此处。 http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html#Standalone-Programs

griddata 包含在 Octave 的几何包中。

方法 2.) PCL:我的方法是使用点云库 ( http://www.pointclouds.org ) 和 VoxelGrid。您可以根据需要设置 x 和 y bin 大小,然后设置一个非常大的 z bin 大小,这将为每个 x、y bin 提供一个 z 值。问题是 x、y 和 z 值是平均到 bin 中的点的质心,而不是 bin 中心(这也是它适用于此的原因)。因此,完成后您需要调整 x,y 值:

例如: // 读入逗号分隔值列表 (x,y,z) FILE * fp; fp = fopen("points.xyz","r");

//store them in PCL's point cloud format
pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);

int numpts=0;
double x,y,z;
while(fscanf(fp, "%lg, %lg, %lg", &x, &y, &z)!=EOF)
{
    pcl::PointXYZ basic_point;
    basic_point.x = x; basic_point.y = y; basic_point.z = z;
    basic_cloud_ptr->points.push_back(basic_point);
}
fclose(fp);
basic_cloud_ptr->width = (int) basic_cloud_ptr->points.size ();
basic_cloud_ptr->height = 1;

// create object for result
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());

// create filtering object and process
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud (basic_cloud_ptr);
//set the bin sizes here.  (dx,dy,dz).  for 2d results, make one of the bins larger 
//than the data set span in that axis
sor.setLeafSize (0.1, 0.1, 1000);
sor.filter (*cloud_filtered);
Run Code Online (Sandbox Code Playgroud)

因此,cloud_filtered 现在是一个点云,每个 bin 包含一个点。然后,如果我想要图像等,我只需制作一个二维矩阵并遍历点云,将点分配给它们的 x,y bin,如 griddata 生成的图像等。它工作得很好,对于大型数据集来说,它比 matlab 的 griddata 快得多。