4个版本 (2个重大更新)
0.3.0 | 2020年3月22日 |
---|---|
0.2.1 | 2020年3月21日 |
0.2.0 | 2020年3月20日 |
0.1.0 | 2020年3月20日 |
#366 在 科学
每月下载量 1,395
120KB
1.5K SLoC
用Rust编写的三次样条逼近(平滑)算法。
csaps 是一个用于使用三次平滑样条对一元、多元和n维网格数据进行逼近的crate。该软件包在数据逼近和平滑的实用工程任务中可能很有用。
使用方法
一元数据自动平滑
use ndarray::{array, Array1};
use csaps::CubicSmoothingSpline;
fn main() {
let x = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
let y = vec![2.3, 3.5, 3.3, 1.2, 4.5, 6.2, 5.6, 7.2, 1.5];
let spline = CubicSmoothingSpline::new(&x, &y)
.make()
.unwrap();
let xi = Array1::linspace(1., 9., 30);
let yi = spline.evaluate(&xi).unwrap();
println!("{}", xi);
println!("{}", yi);
}
带有权重和指定平滑参数的多元数据平滑
use ndarray::{array, Array1};
use csaps::CubicSmoothingSpline;
fn main() {
let x = array![1., 2., 3., 4.];
let y = array![[1., 2., 3., 4.],
[5., 6., 7., 8.]];
let w = array![1., 0.7, 0.5, 1.];
let spline = CubicSmoothingSpline::new(&x, &y)
.with_weights(&w)
.with_smooth(0.8)
.make()
.unwrap();
let xi = Array1::linspace(1., 4., 10);
let yi = spline.evaluate(&xi).unwrap();
println!("{}", xi);
println!("{}", yi);
}
2维网格(表面)数据平滑
use ndarray::array;
use csaps::GridCubicSmoothingSpline;
fn main() {
let x0 = array![1.0, 2.0, 3.0, 4.0];
let x1 = array![1.0, 2.0, 3.0, 4.0];
let x = vec![x0.view(), x1.view()];
let y = array![
[0.5, 1.2, 3.4, 2.5],
[1.5, 2.2, 4.4, 3.5],
[2.5, 3.2, 5.4, 4.5],
[3.5, 4.2, 6.4, 5.5],
];
let yi = GridCubicSmoothingSpline::new(&x, &y)
.with_smooth_fill(0.5)
.make().unwrap()
.evaluate(&x).unwrap();
println!("xi: {:?}", xi);
println!("yi: {}", yi);
}
性能问题
目前,对于大量数据,平滑样条的计算性能可能非常低。
sprs crate中稀疏矩阵乘法的算法未针对大型对角矩阵进行优化,这导致平滑样条计算性能不佳。有关详细信息,请参阅 问题。
算法和实现
crate的实现基于 ndarray 和 sprs crate,并受到了 PGS 中的Fortran过程 SMOOTH(最初由Carl de Boor编写)的启发。
其他语言中的算法实现
参考文献
- C. de Boor, A Practical Guide to Splines, Springer-Verlag, 1978.
许可证
依赖关系
~3.5MB
~75K SLoC