sparse_matrix/
vector.rs

1use std::ops:: {Add, Sub, Mul};
2use serde::{Serialize, Deserialize};
3
4#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
5pub struct Vector {
6    pub values : Vec<f64>
7}
8
9impl Vector {
10    pub fn len(&self) -> usize {
11        self.values.len()
12    }
13
14    pub fn is_empty(&self) -> bool {
15        self.values.is_empty()
16    }
17    
18    pub fn norm(&self) -> f64 {
19        let mut sum = 0.;
20        for x in self.values.iter() {
21            sum += x*x;
22        }
23        sum.sqrt()
24    }
25
26    pub fn null(n : usize) -> Vector {
27        Vector { values : vec![0.;n] }
28    }
29}
30
31impl Add for &Vector {
32    type Output = Result<Vector, &'static str>;
33
34    fn add(self, other: Self) -> Self::Output {
35        if self.values.len() == other.values.len() {
36            let mut result = vec![];
37            for i in 0..self.values.len() {
38                result.push(self.values[i] + other.values[i])
39            }
40            Ok(Vector { values: result })
41        } else {
42            Err("Wrong shapes")
43        }
44    }
45}
46
47impl Sub for &Vector {
48    type Output = Result<Vector, &'static str>;
49
50    fn sub(self, other: Self) -> Self::Output {
51        if self.values.len() == other.values.len() {
52            let mut result = vec![];
53            for i in 0..self.values.len() {
54                result.push(self.values[i] - other.values[i])
55            }
56            Ok(Vector { values: result })
57        } else {
58            Err("Wrong shapes")
59        }
60    }
61}
62
63impl Mul for &Vector {
64    type Output = Result<f64, &'static str>;
65
66    fn mul(self, other: Self) -> Self::Output {
67        if self.values.len() == other.values.len() {
68            let mut result = 0.;
69            for i in 0..self.values.len() {
70                result += self.values[i] * other.values[i];
71            }
72            Ok(result)
73        } else {
74            Err("Wrong shapes")
75        }
76    }
77}
78
79impl Mul<f64> for &Vector {
80    type Output = Vector;
81
82    fn mul(self, other: f64) -> Self::Output {
83        let mut result = self.clone();
84        for i in 0..self.len() {
85            result.values[i] *= other;
86        }
87        result
88    }
89}