processig 0.0.2

digital signal processing tools
Documentation
pub fn calc_mean_from_raw( arr: &[f64] ) -> Option< f64 >{
    if arr.len() == 0 {
        None
    } else {
        Some( arr.iter().sum::<f64>() / arr.len() as f64 )
    }
}

pub fn calc_mean_variance_precision_from_raw( arr: &[f64] ) -> Option< ( f64, f64, f64 ) > {
    match calc_mean_from_raw( arr ) {
        Some(m) => {
            if arr.len() <= 1 {
                None
            } else {
                let temp = arr.iter().fold( 0.0, |acc,&x| acc + (x-m)*(x-m) );
                Some( ( m, temp/((arr.len()-1) as f64), ((arr.len()-1) as f64)/temp ) )
            }
        },
        _ => None,
    }
}

pub fn variance_to_precision( num: f64 ) -> f64 {
    1.0/num
}

pub fn calc_precision_weights( precisions: &[f64] ) -> Vec<f64> {
    let sum : f64 = precisions.iter().sum();
    precisions.iter().map( |x| x/sum ).collect()
}


#[test]
fn test_mean(){
    let x = &[ 0.0, 3.5, 99.9, -45.0 ];
    let m = calc_mean_from_raw(x);
    assert!( m.is_some() );
    let n = m.unwrap();
    assert!( n < 14.6 + 0.00000001 );
    assert!( n > 14.6 - 0.00000001 );
}

#[test]
fn test_calc_mean_variance_precision_from_raw(){
    const ERROR : f64 = 0.01;
    let x = &[ 0.0, 3.5, 99.9, -45.0 ];
    let m = calc_mean_variance_precision_from_raw(x);
    assert!( m.is_some() );
    let n = m.unwrap();
    assert!( n.0 < 14.6 + ERROR);
    assert!( n.0 > 14.6 - ERROR);
    assert!( n.1 < 3721.54 + ERROR );
    assert!( n.1 > 3721.54 - ERROR );
    assert!( n.2 < 1./3721.5 + ERROR );
    assert!( n.2 > 1./3721.5 - ERROR );
}