2013-05-29 18 views
1

我想插入3D标量函数f(x, y, z)。我编写了一个3D线性插值算法(http://en.wikipedia.org/wiki/Trilinear_interpolation)。这并没有那么糟糕。C(或Fortran)中的3D插值方法以及与Shepard方法的比较

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

我也有类似的问题在这里问:

Interpolating a scalar field in a 3D space

What are some good libraries for 3D interpolation?

第二个是确定用Matlab,这我不是。

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

+0

为什么你不想使用matlab? – DSF

+0

我将需要一个大型项目的插值算法,如果所有项目都是用Matlab编码的话,我相信它会太慢。 – db1234

+0

您能否描述您的输入和输出网格:均匀/不均匀,多大? – denis

回答

5

看一看Geometric Tools for Interpolation: 模板化的三维立体C++样条函数,以及更多。
einspline,在一维二维三维B样条C库, 似乎是在2013年蛰伏,笔者不回答电子邮件 此外,公司的C; C++模板将减少代码膨胀插值 花车,颜色,vecs ...) 我还没有使用过这些。

Inverse distance weighting 又名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 /距离可能太尖,太快会下降。
插值方法和内核必须选择适合特定的数据和噪音的艺术。

+0

+1。弗兰克提到了关于这个主题的经典论文。它有点长,至少如果你有所有的情节版本。为此,我曾经在缩微胶片上制作过它,但是这些日子谁有一个缩微阅读器? http://www.ams.org/journals/mcom/1982-38-157/S0025-5718-1982-0637296-4/ – 2013-06-01 13:36:45

+0

@woodchips,good link - cf. matplotlib /德劳/ testfuncs.py。你是否知道自1982年以来的插值方法,度量,测试函数的总结? – denis

+0

感谢einspline的建议,我一定会考虑一下。而且,感谢关于一般插值的智慧和IDW的问题。 – db1234

2

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

+0

是的Bspline太棒了!事实上,刚刚听到它,并在几个月前使用它,在我发布这个问题一年多之后,哈哈。这个问题似乎需要更新,@denis的答案中的许多链接似乎不起作用。知道用于C/C++的工具来做3D插值也是很好的。 – db1234