del-geo-core 0.1.38

2D/3D geometry utility codes
Documentation
pub fn mult_vec<Real, const N: usize, const NN: usize>(a: &[Real; NN], b: &[Real; N]) -> [Real; N]
where
    Real: num_traits::Float,
{
    assert_eq!(NN, N * N);
    let mut c = [Real::zero(); N];
    for i in 0..N {
        for j in 0..N {
            c[i] = c[i] + a[i + N * j] * b[j];
        }
    }
    c
}

pub fn add_in_place<Real, const NN: usize>(a: &mut [Real; NN], b: &[Real; NN])
where
    Real: num_traits::Float,
{
    a.iter_mut()
        .zip(b.iter())
        .for_each(|(va, vb)| *va = *va + *vb);
}

pub fn mult_mat_col_major<Real, const N: usize, const NN: usize>(
    a: &[Real; NN],
    b: &[Real; NN],
) -> [Real; NN]
where
    Real: num_traits::Float,
{
    assert_eq!(NN, N * N);
    let mut c = [Real::zero(); NN];
    for i in 0..N {
        for j in 0..N {
            for k in 0..N {
                c[i + N * j] = c[i + N * j] + a[i + N * k] * b[k + N * j];
            }
        }
    }
    c
}

pub fn try_inverse<Real, const N: usize, const NN: usize>(b: &[Real; NN]) -> Option<[Real; NN]>
where
    Real: num_traits::Float,
{
    crate::matn_row_major::try_inverse::<Real, N, NN>(b)
}

pub fn sub_in_place<Real, const NN: usize>(a: &mut [Real; NN], b: &[Real; NN])
where
    Real: num_traits::Float,
{
    a.iter_mut()
        .zip(b.iter())
        .for_each(|(va, &vb)| *va = (*va) - vb);
}

pub fn transpose<Real, const N: usize, const NN: usize>(a: &[Real; NN]) -> [Real; NN]
where
    Real: num_traits::Float,
{
    let mut c = [Real::zero(); NN];
    for i in 0..N {
        for j in 0..N {
            c[i + N * j] = a[j + N * i];
        }
    }
    c
}