1use std::{ ops::Mul, iter::Sum };
2
3use crate::nxn::NxN;
4
5pub 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
26pub 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
51pub 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}