2014-11-21 48 views
3

我有一個數據點的網格,我目前使用雙線性插值來找到網格中的缺失點。我指出克里格又名您最好的線性無偏估計器,但我無法找到好的源代碼或代數解釋。有誰知道我可以使用的其他插值方法嗎?有人可以描述一種比雙線性插值更好的二維插值方法嗎?

- 更新 @Sam Greenhalgh 我已經考慮過雙立方插值,但是使用我發現的代碼示例收到的結果看起來不對。

這裏是雙三次

注意我編碼在C#中,但我歡迎其他語言的例子,以及代碼示例。

//array 4 
    double cubicInterpolate(double[] p, double x) 
    { 
     return p[1] + 0.5 * x * (p[2] - p[0] + x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] + x * (3.0 * (p[1] - p[2]) + p[3] - p[0]))); 
    } 
    //array 4 4 
    public double bicubicInterpolate(double[][] p, double x, double y) 
    { 
     double[] arr = new double[4]; 
     arr[0] = cubicInterpolate(p[0], y); 
     arr[1] = cubicInterpolate(p[1], y); 
     arr[2] = cubicInterpolate(p[2], y); 
     arr[3] = cubicInterpolate(p[3], y); 
     return cubicInterpolate(arr, x); 
    } 

double[][] p = { 
       new double[4]{2.728562594,2.30599759,1.907579158,1.739559264}, 
       new double[4]{3.254756633,2.760758022,2.210417411,1.979012766}, 
       new double[4]{4.075740069,3.366434527,2.816093916,2.481060234}, 
       new double[4]{5.430966401,4.896723504,4.219613391,4.004306461} 
       }; 

Console.WriteLine(CI.bicubicInterpolate(p, 2, 2)); 
+2

您是否考慮過雙三次插值? – 2014-11-21 15:00:32

+0

看來,克里格以「維納過濾」這個名字更爲人所知。 – 2014-11-21 15:41:56

+0

將@JonSkeet發送給救援如何? – 2014-11-21 18:11:26

回答

2

一個廣泛使用的插值方法是克里金(或高斯過程迴歸)。

但是,當您的數據點位於網格的正常時,不建議使用克里金。數據點之間的歐幾里得距離用於調整模型的參數。但是在一個網格中,距離的數值遠遠少於隨機模擬的一組點數。儘管如此,即使您的數據點經常放置,嘗試一下也可能會很有趣。如果你有興趣,你可以使用以下軟件:

  • DiceKriging包中的R語言(存在其他類似克里格,gstat ...)
  • DACE工具箱在Matlab
  • STK在Matlab /八度
  • 和很多人一樣(在python爲例)...

注:它可以是有趣的(我不正是你想要申請克里格什麼情況下)的克里格插值適當ty可以非常容易地放寬,以便考慮例如可能的測量誤差。

+0

那麼你會推薦使用什麼規則格? – 2014-11-24 18:20:44

+1

我對迴歸的瞭解多於插值:在我遇到的問題中,迴歸更適合。所以我不知道樣條曲線,多項式插值(我不推薦)和克里金。 – Pop 2014-11-25 07:29:00

+1

@Pop你有幾個步驟,對於代數例子中的高斯過程迴歸,我不是一個好的閱讀微積分符號......一個具體數字的簡單例子會非常有幫助。 – Bob 2014-12-01 18:50:34