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科学

Download history 135/week @ 2024-03-13 92/week @ 2024-03-20 101/week @ 2024-03-27 154/week @ 2024-04-03 131/week @ 2024-04-10 155/week @ 2024-04-17 109/week @ 2024-04-24 128/week @ 2024-05-01 152/week @ 2024-05-08 306/week @ 2024-05-15 48/week @ 2024-05-22 44/week @ 2024-05-29 180/week @ 2024-06-05 375/week @ 2024-06-12 484/week @ 2024-06-19 321/week @ 2024-06-26

每月下载量 1,395

MITLGPL-2.1

120KB
1.5K SLoC

csaps

Build status Coverage status crates.io Docs License

用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的实现基于 ndarraysprs crate,并受到了 PGS 中的Fortran过程 SMOOTH(最初由Carl de Boor编写)的启发。

其他语言中的算法实现

参考文献

  • C. de Boor, A Practical Guide to Splines, Springer-Verlag, 1978.

许可证

MIT

依赖关系

~3.5MB
~75K SLoC