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
}
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
}
}