Skip to main content

55_moving_average/
55_moving_average.rs

1//! Simple moving average using slice windows.
2//!
3//! Run: cargo run --example 55_moving_average
4
5use matten::Tensor;
6
7fn main() {
8    let series = Tensor::from_vec(vec![1.0, 3.0, 5.0, 7.0, 9.0, 11.0, 13.0]);
9    let window = 3usize;
10    let n = series.len();
11
12    // Compute moving averages for windows [0..3], [1..4], ...
13    let mut avgs = Vec::new();
14    for start in 0..=(n - window) {
15        let w = series.slice().range(start..start + window).build().unwrap();
16        avgs.push(w.mean());
17    }
18
19    println!("series = {:?}", series.as_slice());
20    println!("3-pt moving avg = {:?}", avgs);
21    assert_eq!(avgs.len(), n - window + 1);
22    assert!((avgs[0] - 3.0).abs() < 1e-10); // mean(1,3,5) = 3
23    assert!((avgs[1] - 5.0).abs() < 1e-10); // mean(3,5,7) = 5
24    println!("Moving average: OK");
25}