use crate::error::MatrixError;
use crate::matrix::Matrix;
pub type VectorC<T, const ROW: usize> = Matrix<T, ROW, 1>;
pub type VectorR<T, const COL: usize> = Matrix<T, 1, COL>;
pub fn times_c<T>(vec1: VectorC<T, 3>, vec2: VectorC<T, 3>) -> Result<VectorC<T, 3>, MatrixError>
where
T: Clone + std::ops::Sub<Output = T> + std::ops::Mul<Output = T>,
{
VectorC::create(vec![
vec1.get_element(2, 1)?.to_owned() * vec2.get_element(3, 1)?.to_owned()
- vec1.get_element(3, 1)?.to_owned() * vec2.get_element(2, 1)?.to_owned(),
vec1.get_element(3, 1)?.to_owned() * vec2.get_element(1, 1)?.to_owned()
- vec1.get_element(1, 1)?.to_owned() * vec2.get_element(3, 1)?.to_owned(),
vec1.get_element(1, 1)?.to_owned() * vec2.get_element(2, 1)?.to_owned()
- vec1.get_element(2, 1)?.to_owned() * vec2.get_element(1, 1)?.to_owned(),
])
}
pub fn times_d<T, const ROW: usize>(
vec1: VectorC<T, ROW>,
vec2: VectorC<T, ROW>,
) -> Result<T, MatrixError>
where
T: std::ops::Mul<Output = T> + std::iter::Sum,
{
Ok(std::iter::zip(vec1.inner, vec2.inner)
.map(|(e1, e2)| e1 * e2)
.sum())
}
pub fn times_v<T, const ROW: usize, const COL: usize>(
vector_c: VectorC<T, ROW>,
vector_r: VectorR<T, COL>,
) -> Result<Matrix<T, ROW, COL>, MatrixError>
where
T: Clone + Default + std::ops::Mul<Output = T>,
{
let mut mat = Matrix::<T, ROW, COL>::create(vec![T::default(); ROW * COL])?;
for r in 1..=ROW {
for c in 1..=COL {
mat.set_element(
r,
c,
vector_c.get_element(r, 1)?.to_owned() * vector_r.get_element(1, c)?.to_owned(),
)?;
}
}
Ok(mat)
}