rstats/
mutvec.rs

1use crate::MutVecg;
2use indxvec::Vecops;
3
4/// Mutable vector operations on `&mut [f64]`, where the operand endtype is generic
5impl MutVecg for &mut [f64] {
6    /// Scalar multiplication of a vector, mutates self
7    fn mutsmult<U:PartialOrd+Into<f64>>(self, s: U)
8    {
9        let sf = s.into();
10        self.iter_mut().for_each(|x| *x *= sf);
11    }
12
13    /// Vector subtraction, mutates self
14    fn mutvsub<U:Clone+PartialOrd+Into<f64>>(self, v: &[U])
15    {
16        self.iter_mut()
17            .zip(v)
18            .for_each(|(x, vi)| *x -= vi.clone().into())
19    }
20
21    /// Vector addition, mutates self
22    fn mutvadd<U:Clone+PartialOrd+Into<f64>>(self, v: &[U])
23    {
24        self.iter_mut()
25            .zip(v)
26            .for_each(|(x, vi)| *x += vi.clone().into())
27    }
28
29    /// Vector with inverse magnitude
30    fn minvert(self) {
31        let recmag2 = 1.0 / self.iter().map(|&x| x.powi(2)).sum::<f64>();
32        for c in self.iter_mut() {
33            *c *= recmag2
34        }
35    }
36
37    // negated vector (all components swap sign)
38    fn mneg(self) {
39        for c in self.iter_mut() {
40            *c *= -1_f64
41        }
42    }
43
44    /// Unit vector
45    fn munit(self) {
46        let m = (1.0 / self.iter().map(|&x| x.powi(2)).sum::<f64>()).sqrt();
47        for c in self.iter_mut() {
48            *c *= m
49        }
50    }
51
52    /// Linear transform to interval [0,1]
53    fn mlintrans(self) {
54        let mm = self.minmax();
55        let range = mm.max - mm.min;
56        for c in self.iter_mut() {
57            *c = (*c - mm.min) / range
58        }
59    }
60}