c++ - 分散数据的二维值插值

标签 c++ interpolation

<分区>

我正在寻找一种方法来从某些 2D 散点数据中插入值。我有一个代表地形的 3d 点,我想从中插入中间点。对于输入 (X,Y) 坐标,我需要 Z(高度)值。

This article on wikipedia也可以帮助你理解我的意愿。 matlab 中有一个名为 triscateredinterp 的库,我认为它可以满足我的需求。

在 C++ 中实现这种插值的轻量级方法是什么?

最佳答案

我认为您不需要 3D 插值 (triscateredinterp)。您有基于二维输入的数据;第三维是你的输出。如果我理解正确的话,您想提供一个 2D 点(原始点之间的某个点,然后插入该值。

重量轻?最近的邻居!;然后是双线性插值;然后是双三次(和其他)。第一个很简单,其他的则需要越来越多的数学知识。

双线性:对于每个要插值的点,找到离您的 X 和 Y 最近的 3 个点:

lat long Altitude
X1   Y1   A1
X2   Y2   A2
X3   Y3   A3

制作这些矩阵:

    X1   Y1   1                      A1
X = X2   Y2   1                  Y = A2
    X3   Y3   1                      A3

B 是我们将为这三个最近点计算的插值系数(并且可以重复用于该区域中的所有点)

    B1
B = B2
    B3

矩阵方程为:X*B = Y

你可以使用蛮力: 两边乘以 XT:XT*X*B = XT*Y
取 XT*X 的倒数:B = (XT*X)^-1 *XT*Y

是的 3x3 矩阵求逆。将此与 C++ 问题联系起来,您可以将 Boost 用于矩阵运算。

这是另一个类似的 C++ 问题:Solving a system of equations programmably?

双线性技术可能出现的一个问题是,当您的插值点越来越接近一组不同的 3 个值时,您可能会得到一些跳跃(您将如何在鞍配置中插值 4 个点?)

关于c++ - 分散数据的二维值插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20484233/

相关文章:

c++ - 使用自定义模块构建 python 解释器时出现问题

r - 使用 tidyverse 在按日期分组的大型 R 数据框中线性插值

javascript - D3 动画问题 : ease

python - python 中的 4d 插值

c++ - 为什么 @ 和 $ 字符不用于 C 和 C++ 中的任何内容?

c++ - 用 std::addressof 存储指针地址

time-series - 执行 "online"线性插值

perl - 如何将 __LINE__ 中的行号插入到 Perl 中的测试名称中?

C++ 指向成员成员的指针?

c++ - 包含成员函数名称为errno和cerrno时的g++ 7编译错误