【问题标题】:Could someone describe a 2d interpolation method that is better than bilinear interpolation?有人可以描述一种比双线性插值更好的二维插值方法吗?
【发布时间】:2015-01-19 18:22:21
【问题描述】:

我有一个数据点网格,我目前使用双线性插值来查找网格中的缺失点。我被指出了 Kriging aka thee best linear unbiased estimator 的方向,但我找不到好的源代码或代数解释。有谁知道我可以使用的其他插值方法吗?

--更新 @山姆格林哈尔 我考虑过双三次插值,但使用我找到的代码示例收到的结果似乎不正确。

这是 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));

【问题讨论】:

  • 你考虑过双三次插值吗?
  • 似乎克里金法以“维纳滤波”的名义更为人所知。
  • 发送@JonSkeet 来救援怎么样?

标签: c# interpolation spatial-interpolation kriging


【解决方案1】:

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

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

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

  • R 语言中的 DiceKriging 包(还有其他类似 kriging、gstat...)
  • Matlab 中的 DACE 工具箱
  • Matlab/Octave 中的 STK
  • 还有很多其他的(例如在 python 中)...

注意:值得注意的是(我不确切地在什么情况下要应用克里金法)克里金法插值属性可以很容易地放宽,以便考虑例如可能的测量错误。

【讨论】:

  • 那么您会建议将什么用于常规网格?
  • 我对回归的了解远多于插值:在我习惯遇到的问题中,回归更适合。所以我对样条曲线、多项式插值(我不推荐)和克里金一无所知。
  • @Pop 你有步骤吗,对于代数例子中的高斯过程回归,我不擅长阅读微积分符号......一个带有具体数字的简单例子会非常有帮助。
【解决方案2】:

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

Math.NET Numerics 具有您需要的分段线性样条函数:

MathNet.Numerics.Interpolation.LinearSpline.InterpolateSorted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2016-06-22
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多