2013-05-29 19 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