1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52


pub fn radians(d:f64) -> f64 {
    d * std::f64::consts::PI / 180.0
}

pub fn degrees(r:f64) -> f64 {
    r * 180.0 / std::f64::consts::PI
}

//https://rust-lang-nursery.github.io/rust-cookbook/science/mathematics/statistics.html
pub fn mean(data: &[f32]) -> Option<f32> {
    let sum = data.iter().sum::<f32>() as f32;
    let count = data.len();

    match count {
        positive if positive > 0 => Some(sum / count as f32),
        _ => None,
    }
}



pub fn std_deviation(data: &[f32]) -> Option<f32> {
    match (mean(data), data.len()) {
        (Some(data_mean), count) if count > 0 => {
            let variance = data.iter().map(|value| {
                let diff = data_mean - (*value as f32);

                diff * diff
            }).sum::<f32>() / count as f32;

            Some(variance.sqrt())
        },
        _ => None
    }
}


pub fn z_score(pixel_value:f32, data:&[f32]) -> Option<f32> {
    let data_mean = mean(&data);
    let data_std_deviation = std_deviation(&data);
    let data_value = pixel_value;

    match (data_mean, data_std_deviation) {
        (Some(mean), Some(std_deviation)) => {
            let diff = data_value as f32 - mean;
            Some(diff / std_deviation)
        },
        _ => None
    }
}