有人能描述一种比双线性插值更好的二维插值方法吗?

时间:2014-11-21 14:58:07

标签: c# interpolation spatial-interpolation kriging

我有一个数据点网格,我目前使用双线性插值来找到网格中的缺失点。我被指向Kriging的方向,也就是最好的线性无偏估计,但我无法找到好的源代码或代数解释。有谁知道我可以使用的任何其他插值方法?

- 更新 @Sam Greenhalgh 我考虑过Bicubic插值,但是我使用我发现的代码示例得到的结果似乎没有了。

以下是Bicubic的代码示例

注意我在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 个答案:

答案 0 :(得分:2)

一种广泛使用的插值方法是克里金法(或高斯过程回归)。

但是,当您的数据点位于常规网格上时,不建议使用克里金法。数据点之间的欧几里德距离用于调整模型的参数。但是在网格中,距离的值比在随机模拟的点集中少得多。

尽管如此,即使您的数据点经常被放置,尝试一下也会很有趣。如果您有兴趣,可以使用以下软件:

  • R语言的DiceKriging包(还有其他像kriging,gstat ......)
  • Matlab中的DACE工具箱
  • STK in Matlab / Octave
  • 还有很多其他人(比如python)......

注意:值得注意的是(我并不完全在你想要应用克里金法的上下文中)克里金插值属性可以很容易地放宽,以便考虑,例如,可能的测量错误。

答案 1 :(得分:0)

如果您的数据点位于规则网格上,建议您使用二维的分段线性样条线。您可以先填充行(x值)的数据,然后填充列(y值)的数据。

httrack具有您需要的分段线性样条函数:

MathNet.Numerics.Interpolation.LinearSpline.InterpolateSorted