将网格投影到分层不相关的网格上的更快方法?

计算科学 算法
2021-12-09 13:04:27

我有一组独立的网格,我想将其结果投影到另一个非层次相关的网格上。到目前为止,我一直通过在输入网格中找到最近距离节点(通过最小化误差)并将其值分配给目标网格来实现这一点。这似乎是解决问题( ref1ref2 )最常用的方法,但由于这个项目的要求,我想尽可能快地实现一些东西。L2

因此,我想知道是否有其他更快的方法可以将网格结果投影到另一个网格上。不幸的是,我不能强制输入网格和目标网格相关,因为输入网格的结果将在运行时进行转换(旋转/平移)。这消除了我至少知道的大多数网格投影方法,这就是我想去社区寻求帮助的原因。我知道,就网格投影方法而言,我当前的方法可能保留了最准确的方法,但我同意以准确性换取速度。

谢谢!

2个回答

我在您引用的一篇文章中提到的 MATLAB 分散插值类的工作原理如下:给定一个您想要插值的新点,分散插值首先尝试在包含该点的旧网格中找到三角形单元,然后在其中进行线性插值细胞。该算法最耗时的部分是找到包含该点的单元格。

如果我理解正确,您只需通过在旧网格中找到最接近新点的点来插入新点。如果您对这种准确度水平感到满意,则可以显着提高搜索最近点的性能。已经写了整本书关于空间搜索的算法。一种常见的方法是使用 kd-tree。首先,您将旧网格中的所有点添加到树中,然后您可以快速查询树以找到与一组新点最近的点。您可以在网上找到几个开源的 kd-trees 实现,例如

https://code.google.com/p/kdtree/

http://www.cs.umd.edu/~mount/ANN/

使用您描述的方法(使用最近点的值),您实际上不是将上定义投影到网格上,而是将函数到分段常数。具体来说,在点处与定义它的网格的最近节点具有相同的值,这对应于的对偶网格(与节点对应的 Voronoi 网格)上的分段常数插值。换句话说,您正在计算因为插值只有u1T1T2Iu1Iu1xT1u2=P2IuiO(h)准确,实际上没有任何理由使用精确投影,您必须计算和反转质量矩阵。相反,您也可以在第二个网格上使用插值。换句话说,如果大小 {\cal O}(h) 的误差足够了,那么网格应该只是的值,其中是网格 1的最近节点O(h2)O(h)u2(xj(2))xj(2)T2u1(xk(1))xk(1)xj(2)