lair 0.6.0

Linear algebra in Rust
Documentation
use crate::Scalar;
use ndarray::{s, ArrayBase, Axis, DataMut, Ix2};
use std::cmp;

#[allow(dead_code)]
pub fn lower_zero<A, S>(a: &mut ArrayBase<S, Ix2>)
where
    A: Scalar,
    S: DataMut<Elem = A>,
{
    if a.ncols() == 0 {
        return;
    }

    let col_max = a.ncols() - 1;
    for (i, mut row) in a.lanes_mut(Axis(1)).into_iter().enumerate() {
        for v in row.slice_mut(s![..=cmp::min(i, col_max)]) {
            *v = A::zero();
        }
    }
}

#[cfg(test)]
mod tests {
    use ndarray::{arr2, Array2};

    #[test]
    fn lower_zero() {
        let mut a = Array2::<f64>::ones((0, 0));
        super::lower_zero(&mut a);
        assert_eq!(a, Array2::<f64>::zeros((0, 0)));

        let mut a = Array2::<f64>::ones((0, 2));
        super::lower_zero(&mut a);
        assert_eq!(a, Array2::<f64>::zeros((0, 2)));

        let mut a = Array2::<f64>::ones((2, 0));
        super::lower_zero(&mut a);
        assert_eq!(a, Array2::<f64>::zeros((2, 0)));

        let mut a = Array2::<f64>::ones((2, 3));
        super::lower_zero(&mut a);
        assert_eq!(a, arr2(&[[0., 1., 1.], [0., 0., 1.]]));

        let mut a = Array2::<f64>::ones((3, 2));
        super::lower_zero(&mut a);
        assert_eq!(a, arr2(&[[0., 1.], [0., 0.], [0., 0.]]));
    }
}