use crate::matrix::Matrix;
use crate::number::Number;
use crate::{error::Result, number::Fractional};
#[cfg(feature = "rayon_mat")]
use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator};
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>>
where
T: Number,
{
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>
where
T: Number,
{
#[cfg(feature = "rayon_mat")]
let prod = vec1
.inner
.par_iter()
.zip(vec2.inner.par_iter())
.map(|(e1, e2)| e1.to_owned() * e2.to_owned())
.sum();
#[cfg(not(feature = "rayon_mat"))]
let prod = vec1
.inner
.iter()
.zip(vec2.inner.iter())
.map(|(e1, e2)| e1.to_owned() * e2.to_owned())
.sum();
Ok(prod)
}
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>>
where
T: Number,
{
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)
}
pub fn l2_norm_c<T, const ROW: usize>(vc: VectorC<T, ROW>) -> T
where
T: Fractional,
{
#[cfg(feature = "rayon_mat")]
let norm = vc
.inner
.par_iter()
.map(|e| e.to_owned() * e.to_owned())
.sum::<T>()
.sqrt();
#[cfg(not(feature = "rayon_mat"))]
let norm = vc
.inner
.iter()
.map(|e| e.to_owned() * e.to_owned())
.sum::<T>()
.sqrt();
norm
}