nexsys_math/
linalg.rs

1use std::{ ops::Mul, iter::Sum };
2
3use crate::nxn::NxN;
4
5/// Returns the dot product of two given vectors.
6pub fn vec_vec_dot<T, U>(lhs: &Vec<T>, rhs: &Vec<U>) -> Result<T, &'static str> 
7where   
8    T: Copy + Mul<U> + Sum::<<T as Mul<U>>::Output>,
9    U: Copy
10{
11    if lhs.len() != rhs.len() {
12        return Err("vectors must be the same size!")
13    }
14    let mut count = 0;
15    let dot_prod = lhs.iter().map(
16        |&i| {
17            let res = i * rhs[count];
18            count += 1;
19            res
20        }
21    ).sum();
22
23    Ok(dot_prod)
24}
25
26/// Multiplies a matrix and a column vector.
27pub fn mat_vec_mul<T>(lhs: NxN, rhs: Vec<T>) -> Result<Vec<T>, &'static str> 
28where
29    T: Copy + Mul<f64> + Sum::<<T as Mul<f64>>::Output>
30{
31    if lhs.size != rhs.len() {
32        return Err("vectors must be the same size!")
33    }
34
35    let mat = lhs.to_vec();
36    let mut res = vec![];
37
38    for i in 0..rhs.len() {
39
40        let mut row = vec![];
41
42        for j in 0..rhs.len() {
43            row.push(mat[j][i]);
44        }
45
46        res.push(vec_vec_dot(&rhs, &row)?)
47    }
48    Ok(res)
49}
50
51/// Scales a vector by the given value.
52pub fn scale_vec<T, U>(vec: Vec<T>, scalar: U) -> Vec<T> 
53where 
54    T: Copy + Mul<U>, 
55    Vec<T>: FromIterator<<T as Mul<U>>::Output>,
56    U: Copy
57{
58    vec.iter().map( |&i| i * scalar ).collect()
59}