C(或Fortran)中的3D插值方法,以及与Shepard方法的比较

时间:2013-05-29 13:03:16

标签: c interpolation

我想插入一个3D标量函数f(x, y, z)。我编写了一个3D线性插值算法(http://en.wikipedia.org/wiki/Trilinear_interpolation)。这并不是那么糟糕。

然而,我想要更复杂的东西,例如3D立方样条。是否有任何开源的,易于使用的公开代码可用于插入3D标量?我更喜欢使用C,但Fortran也可以。我想远离Matlab。

我在这里看到了类似的问题:

Interpolating a scalar field in a 3D space

What are some good libraries for 3D interpolation?

第二个可以和Matlab一起使用,我不是。

至于第一个,主要的建议是谢泼德的方法。我很好奇Shepard的方法是多么准确。例如,在均匀网格的情况下,可以将Shepard方法仅应用于附近的网格点,在这种情况下,它是否比线性插值或三次样条更准确?我想象不是,但不是100%肯定,如果实际上并不是更好,那么如果有任何这样的代码,我宁愿使用类似样条的代码来找代码。

3 个答案:

答案 0 :(得分:5)

看看Geometric Tools for Interpolation: 用于三重,均匀B样条的模板化C ++等等 (einspline,1d 2d 3d中B样条的C库, 似乎在2013年处于休眠状态;作者没有回复电子邮件。 而且,它是C; C ++模板可以减少代码膨胀以进行插值 花车,颜色,vecs ...) 我没有使用其中任何一个。

Inverse distance weighting上 a.k.a. Shepard的方法,你可以把任何个邻居:在3d,2 ^ 3或3 ^ 3或4 ^ 3 ......中 一般问题是“下垂” - 请参阅链接中的图表。

任何插值方法的“准确性”都很难衡量:什么是“黄金”, 什么类别的数据/什么噪音?
你有两个措施,数据错误和平滑性,以进行权衡 - 为 photo enlargement 三:
混叠,模糊和边缘光晕。 关于带限函数的样条插值有一些理论,但对于IDW来说完全没有。

添加了: 关于 bullseye effect

  几乎在所有情况下,IDW都是一个糟糕的选择。   它假设您的所有输入数据点都是本地最小值或最大值!

如果远处有高峰,IDW可能会在附近的数据点上方出现峰值。 例如在1d中,
IDW([0 0] [1 0] [2 y])= y / 7,x = 1/2。 但是对于某些任务来说,IDW重量~1 /距离可能太尖锐,下降得太快 必须选择插值方法和内核以适应特定数据和噪声 - 这是一门艺术。

答案 1 :(得分:2)

bspline-fortran库对常规网格上的数据进行2d-6d b样条插值。它是用现代Fortran编写的(有一个基本的子程序接口,也是一个面向对象的接口)。

答案 2 :(得分:0)

vspline 是一个用于 b 样条处理的 FOSS C++ 模板库。它与维度无关,因此您可以将其用于 3D 数据。它的重点是使用多线程 SIMD 代码有效地处理大型栅格数据集。如果您关心精度,它可以使用 long double 进行计算,并具有极其精确的预计算常量以实现最大保真度。