有人可以描述一种比双线性插值更好的二维插值方法吗?
本文关键字:插值 更好 二维 方法 描述 一种 双线性 | 更新日期: 2023-09-27 18:31:29
我有一个数据点网格,我目前使用双线性插值来查找网格中缺失的点。我被指向克里金法的方向,也就是最好的线性无偏估计器,但我找不到好的源代码或代数解释。有谁知道我可以使用的任何其他插值方法?
--更新@Sam 格林哈尔格我已经考虑过双三次插值,但我使用我发现的代码示例收到的结果似乎不对劲。
这是双立方的代码示例
请注意,我正在使用 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软件包(还有其他的,如克里金法,gstat...)
- Matlab 中的 DACE 工具箱
- Matlab/Octave 中的 STK
- 还有许多其他人(例如在 python 中)...
注意:值得注意的是(我不确切地说,您希望在什么上下文中应用克里金法),克里金插值属性可以很容易地放宽,以便考虑例如可能的测量误差。
如果你的数据点在规则的网格上,我建议在二维中使用分段线性样条。 您可以先填充行的数据(x 值),然后填充列的数据(y 值)。
Math.NET Numerics 具有您需要的分段线性样条函数:
MathNet.Numerics.Interpolation.LinearSpline.InterpolateSorted