#interpolation #n-dimensional #scientific-computing #grid #methods #multidimensional #performance

无需std interpn

多维插值/外推方法,与no-std和no-alloc兼容

6个版本 (3个重大更新)

0.4.3 2024年8月21日
0.4.2 2024年3月12日
0.3.0 2023年12月18日
0.2.0 2023年12月7日
0.1.0 2023年11月22日

科学分类中排名第62

Download history 4/week @ 2024-05-17 2/week @ 2024-05-24 1/week @ 2024-06-07 98/week @ 2024-07-05 7/week @ 2024-07-12 18/week @ 2024-07-26 2/week @ 2024-08-02 176/week @ 2024-08-16

每月下载量196
flaw中使用

MIT/Apache

105KB
1.5K SLoC

InterpN

多维插值/外推方法,与no-std和no-alloc兼容,优先考虑正确性、性能和与内存受限环境的兼容性。

性能缩放

注意,对于自洽的多维线性插值,有2^ndims个网格值贡献于每个观测点,因此这是性能缩放的理论下限。话虽如此,根据实现,常数项可以变化超过一个数量级。

三次插值需要每个维度多两个自由度,这导致最小运行时间缩放为4^ndims。与线性方法类似,根据实现,常数项可以变化超过数量级,RAM的使用也可以。

矩形单位方法执行二分查找以找到相关的网格单元,这需要log2(网格元素数量)的最坏情况迭代次数。

方法 RAM 插值/外推成本
multilinear::regular O(ndims) O(2^ndims)
multilinear::rectilinear O(ndims) O(2^ndims) + log2(gridsize)
multicubic::regular O(ndims) O(4^ndims)
multicubic::rectilinear O(ndims) O(4^ndims) + log2(gridsize)

示例:具有规则网格的线性插值和多项式插值

use interpn::{multilinear, multicubic};

// Define a grid
let x = [1.0_f64, 2.0, 3.0, 4.0];
let y = [0.0_f64, 1.0, 2.0, 3.0];

// Grid input for rectilinear method
let grids = &[&x[..], &y[..]];

// Grid input for regular grid method
let dims = [x.len(), y.len()];
let starts = [x[0], y[0]];
let steps = [x[1] - x[0], y[1] - y[0]];

// Values at grid points
let z = [2.0; 16];

// Observation points to interpolate/extrapolate
let xobs = [0.0_f64, 5.0];
let yobs = [-1.0, 3.0];
let obs = [&xobs[..], &yobs[..]];

// Storage for output
let mut out = [0.0; 2];

// Do interpolation
multilinear::regular::interpn(&dims, &starts, &steps, &z, &obs, &mut out);
multicubic::regular::interpn(&dims, &starts, &steps, &z, false, &obs, &mut out);

示例:具有矩形单位网格的线性插值和多项式插值

use interpn::{multilinear, multicubic};

// Define a grid
let x = [1.0_f64, 2.0, 3.0, 4.0];
let y = [0.0_f64, 1.0, 2.0, 3.0];

// Grid input for rectilinear method
let grids = &[&x[..], &y[..]];

// Values at grid points
let z = [2.0; 16];

// Points to interpolate/extrapolate
let xobs = [0.0_f64, 5.0];
let yobs = [-1.0, 3.0];
let obs = [&xobs[..], &yobs[..]];

// Storage for output
let mut out = [0.0; 2];

// Do interpolation
multilinear::rectilinear::interpn(grids, &z, &obs, &mut out).unwrap();
multicubic::rectilinear::interpn(grids, &z, false, &obs, &mut out).unwrap();

开发路线图

  • 无结构三角形和四面体网格的方法

许可

根据您的选择,许可为以下之一

依赖项

~475–670KB
~13K SLoC