algebrust 0.1.1

A Rust library for basic linear algebra operations.
Documentation
use rand::{distributions::Uniform, Rng};

pub struct AlgebrustVector {
    vector: Vec<f64>
}

impl AlgebrustVector {
    pub fn new(vector: &[f64]) -> Self {
        AlgebrustVector { 
            vector: vector.to_vec()
        }
    }

    pub fn new_rand(length: usize, low: f64, high: f64) -> Self {
        let mut rng = rand::thread_rng();
        let range = Uniform::new(low, high);
        let vector: Vec<f64> = (0..length)
            .map(|_| rng.sample(&range))
            .collect();
        AlgebrustVector { vector }
    }

    pub fn new_zeros(length: usize) -> Self {
        let vector = vec![0.0; length];
        AlgebrustVector { vector }
    }

    pub fn len(&self) -> usize {
        self.vector.len()
    }

    pub fn vector_ref(&self) -> &Vec<f64> {
        &self.vector
    }

    pub fn addition(&self, other: &AlgebrustVector) -> AlgebrustVector {
        assert_eq!(self.len(), other.len());
        let vector: Vec<f64> = self.vector
            .iter()
            .zip(&other.vector)
            .map(|(a, b)| a + b)
            .collect();
        AlgebrustVector { vector }
    }

    pub fn subtraction(&self, other: &AlgebrustVector) -> AlgebrustVector {
        assert_eq!(self.len(), other.len());
        let vector: Vec<f64> = self.vector
            .iter()
            .zip(&other.vector)
            .map(|(a, b)| a - b)
            .collect();
        AlgebrustVector { vector }
    }

    pub fn dot_product(&self, other: &AlgebrustVector) -> f64 {
        assert_eq!(self.len(), other.len());
        self.vector
            .iter()
            .zip(&other.vector)
            .map(|(a, b)| a * b)
            .sum()
    }

    pub fn scalar_multiplication(&self, scaler: f64) -> AlgebrustVector {
        let vector: Vec<f64> = self.vector
            .iter()
            .map(|a| a * scaler)
            .collect();
        AlgebrustVector { vector }
    }

    pub fn magnitude(&self) -> f64 {
        let squared_sum: f64 = self.vector
            .iter()
            .map(|a| a * a)
            .sum();
        squared_sum.sqrt()
    }

    pub fn normalization(&self) -> AlgebrustVector {
        let magnitude = self.magnitude();
        let vector: Vec<f64> = self.vector
            .iter()
            .map(|a| a / magnitude)
            .collect();
        AlgebrustVector { vector }
    }

    pub fn cross_product(&self, other: &AlgebrustVector) -> AlgebrustVector {
        assert_eq!((self.len(), other.len()), (3, 3));
        AlgebrustVector { 
            vector: vec![
                (self.vector[1] * other.vector[2]) - (self.vector[2] * other.vector[1]),
                (self.vector[2] * other.vector[0]) - (self.vector[0] * other.vector[2]),
                (self.vector[0] * other.vector[1]) - (self.vector[1] * other.vector[0])
            ] 
        }
    }
}