lair 0.8.0

Linear algebra in Rust
Documentation
use ndarray::{ArrayBase, Data, Ix1};
use num_traits::Float;

use crate::Scalar;

pub(crate) fn nrm2<A, S>(x: &ArrayBase<S, Ix1>) -> A::Real
where
    A: Scalar,
    S: Data<Elem = A>,
{
    x.iter()
        .map(|v| v.re() * v.re() + v.im() * v.im())
        .sum::<A::Real>()
        .sqrt()
}

#[cfg(test)]
mod tests {
    use approx::assert_abs_diff_eq;
    use ndarray::arr1;
    use num_complex::Complex64;

    #[test]
    fn real() {
        let x = arr1(&[3., 4.]);
        let norm = super::nrm2(&x);
        assert_eq!(norm, 5.);
    }

    #[test]
    fn complex() {
        let x = arr1(&[Complex64::new(1., 2.), Complex64::new(3., 4.)]);
        let norm = super::nrm2(&x);
        assert_abs_diff_eq!(norm, 5.477225575051661, epsilon = 1e-8);
    }
}