pub fn mulScalarVector(s: f32, v: &Vec<f32>) -> Vec<f32> {
    v.iter().map(|a| a * s).collect()
}

pub fn subVectors(v1: &Vec<f32>, v2: &Vec<f32>) -> Vec<f32> {
    v1.iter().zip(v2).map(|(a, b)| a - b).collect()
}
pub fn addVectors(v1: &Vec<f32>, v2: &Vec<f32>) -> Vec<f32> {
    v1.iter().zip(v2).map(|(a, b)| a + b).collect()
}

pub fn dotVectors(v1: &Vec<f32>, v2: &Vec<f32>) -> f32 {
    v1.iter().zip(v2).map(|(a, b)| a * b).sum()
}

pub fn normVector(v: &Vec<f32>) -> f32 {
    dotVectors(v, v).powf(0.5)
}

pub fn normalizeVector(v: &Vec<f32>) -> Vec<f32> {
    let vNorm = normVector(&v);
    v.iter().map(|a| a / vNorm).collect()
}

pub fn checkEqualLenVectors(v1: &Vec<f32>, v2: &Vec<f32>) -> bool {
    v1.len() == v2.len()
}
