gp/
vector.rs

1use nalgebra::base::dimension::{Dim as _, Dynamic, U1};
2use nalgebra::base::{VecStorage, Vector as InnerVector};
3use std::iter::FromIterator;
4use std::ops;
5
6/// Column vector.
7pub type ColVec = Vector;
8
9#[derive(Debug, Clone)]
10pub struct Vector {
11    inner: InnerVector<f64, Dynamic, VecStorage<f64, Dynamic, U1>>,
12}
13impl Vector {
14    pub fn new(inner: InnerVector<f64, Dynamic, VecStorage<f64, Dynamic, U1>>) -> Self {
15        Self { inner }
16    }
17
18    pub fn len(&self) -> usize {
19        self.inner.len()
20    }
21
22    pub fn iter<'a>(&'a self) -> impl 'a + Iterator<Item = f64> {
23        self.inner.iter().copied()
24    }
25
26    pub fn as_slice(&self) -> &[f64] {
27        self.inner.as_slice()
28    }
29
30    pub fn into_inner(self) -> InnerVector<f64, Dynamic, VecStorage<f64, Dynamic, U1>> {
31        self.inner
32    }
33}
34impl From<Vec<f64>> for Vector {
35    fn from(f: Vec<f64>) -> Self {
36        let rows = Dynamic::from_usize(f.len());
37        let inner = InnerVector::from_data(VecStorage::new(rows, U1, f));
38        Self { inner }
39    }
40}
41impl FromIterator<f64> for Vector {
42    fn from_iter<T>(iter: T) -> Self
43    where
44        T: IntoIterator<Item = f64>,
45    {
46        Self::from(iter.into_iter().collect::<Vec<_>>())
47    }
48}
49impl ops::Add<ColVec> for ColVec {
50    type Output = ColVec;
51
52    fn add(self, rhs: Self) -> Self::Output {
53        Self::new(self.into_inner() + rhs.into_inner())
54    }
55}