math_utils_lib 0.4.1

A library providing math utilities such as a parser/evaluator and a LaTeX export to export a history of parsed expressions and solved equations to LaTeX.
Documentation
use crate::basetypes::Value;

use super::mult_div::mmmult;

#[doc(hidden)]
pub fn vcross(a: &Vec<f64>, b: &Vec<f64>) -> Result<Value, String> {
    if a.len() != b.len() {
        return Err("Vectors have different dimensions!".to_string());
    }
    if a.len() > 3 {
        return Err("Can't compute cross product with dim(V) > 3!".to_string());
    }

    let mut output_v = vec![];
    let mut expand_va = vec![];
    let mut expand_vb = vec![];
    for i in 0..3 {
        if i < a.len() {
            expand_va.push(a[i]);
            expand_vb.push(b[i]);
        } else {
            expand_va.push(0.);
            expand_vb.push(0.);
        }
    }

    output_v.push(expand_va[1] * expand_vb[2] - expand_va[2] * expand_vb[1]);
    output_v.push(expand_va[2] * expand_vb[0] - expand_va[0] * expand_vb[2]);
    output_v.push(expand_va[0] * expand_vb[1] - expand_va[1] * expand_vb[0]);

    return Ok(Value::Vector(output_v));
}

#[doc(hidden)]
pub fn sspow(a: &f64, b: &f64) -> Result<Value, String> {
    return Ok(Value::Scalar(a.powf(*b)));
}

#[doc(hidden)]
pub fn mspow(a: &Vec<Vec<f64>>, b: &f64) -> Result<Value, String> {
    if b.round() != *b {
        return Err("Exponent must be an integer!".to_string());
    }
    let mut mult = vec![];
    for i in 0..a.len() {
        let mut row = vec![];
        for j in 0..a[0].len() {
            if i == j {
                row.push(1.);
            } else {
                row.push(0.);
            }
        }
        mult.push(row);
    }
    for _ in 0..(*b as i32) {
        mult = mmmult(&mult, a)?.get_matrix().unwrap();
    }

    Ok(Value::Matrix(mult))
}