c# - 有人可以描述一种比双线性插值更好的二维插值方法吗?

标签 c# interpolation spatial-interpolation kriging

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

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

这是双三次的代码示例

请注意,我正在使用 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));

最佳答案

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

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

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

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

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

关于c# - 有人可以描述一种比双线性插值更好的二维插值方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064183/

相关文章:

python - 使用numpy和scipy将wrf数据的网格点插值到python中的lat lon

r - 为插值方法创建数据对象,例如 R 中的克里金法

c# - 使用 LINQ 按字符串出现选择和分组?

python - For 循环似乎比 NumPy/SciPy 3D 插值更快

python - 使用 numpy 提高阶跃函数的分辨率

python - 二维线性插值产生数据范围之外的结果

c# - 使用 XPath 和 C# 移动多个 iFrame

c# - 防止审计表被篡改

c# - 获取 url 的主要部分,包括虚拟目录

Matlab 3D 插值