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

db1*_*234 1 c interpolation

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

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

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

插值3D空间中的标量场

什么是3D插值的好库?

第二个是Matlab,但我不是.

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

den*_*nis 5

看看用于插值的几何工具:用于三重,均匀B样条的模板化C++等等.
(einspline,1d 2d 3d中B样条的C库,在2013年似乎处于休眠状态;作者没有回复电子邮件.此外,它是C; C++模板可以减少代码膨胀,用于插入浮点数,颜色,向量. .)我没有使用过这两种方法.

逆距离加权 又名Shepard的方法中,你可以选择任意数量的邻居:在3d,2 ^ 3或3 ^ 3或4 ^ 3 ......
一般问题是"下垂" - 参见链接中的图.

任何插值方法的"准确性"真的难以衡量:什么是"黄金",对于什么类别的数据/什么噪声?
你有两个措施,数据错误和平滑,折衷 - 照片放大 三:
混叠,模糊和边缘晕.关于带限函数的样条插值有一些理论,但对于IDW来说完全没有.

补充: 牛眼效应怎么样?

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

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