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
pub fn scale(a: &Vec<f32>, by: f32) -> Vec<f32> {
a.iter().map(|a| a * by).collect()
}
pub fn sum(a: &Vec<f32>, b: &Vec<f32>) -> Vec<f32> {
assert_eq!(a.len(), b.len());
a.iter().zip(b.iter()).map(|(a_i, b_i)| a_i + b_i).collect()
}
pub fn difference(a: &Vec<f32>, b: &Vec<f32>) -> Vec<f32> {
assert_eq!(a.len(), b.len());
a.iter().zip(b.iter()).map(|(a_i, b_i)| a_i - b_i).collect()
}
pub fn norm(a: &Vec<f32>) -> f32 {
a.iter().map(|x| x.abs()).sum::<f32>().sqrt()
}
pub fn distance(a: &Vec<f32>, b: &Vec<f32>) -> f32 {
norm(&difference(a, b))
}
pub fn sum_many(xs: &Vec<Vec<f32>>) -> Vec<f32> {
let len = xs[0].len();
let zero = vec![0.; len];
xs.iter().fold(zero, |a, x| sum(&a, x))
}
pub fn average(xs: &Vec<Vec<f32>>) -> Vec<f32> {
let len = xs.len() as f32;
let sum = sum_many(xs);
sum.iter().map(|a| a / len).collect()
}