mathru 0.16.2

Fundamental algorithms for scientific computing in Rust
Documentation
use crate::algebra::abstr::{Field, Scalar};
use crate::algebra::linear::matrix::substitute::SubstituteBackward;
use crate::algebra::linear::{
    matrix::{General, UnitUpperTriangular},
    vector::Vector,
};

impl<T> SubstituteBackward<Vector<T>> for UnitUpperTriangular<T>
where
    T: Field + Scalar,
{
    fn substitute_backward(&self, c: Vector<T>) -> Result<Vector<T>, ()> {
        let mut b: Vector<T> = c;
        let rows = self.matrix.nrows();

        for k in (0..rows).rev() {
            for l in (k + 1..rows).rev() {
                b[k] = b[k] - self[[k, l]] * b[l];
            }
        }

        Ok(b)
    }
}

impl<T> SubstituteBackward<General<T>> for UnitUpperTriangular<T>
where
    T: Field + Scalar,
{
    fn substitute_backward(&self, a: General<T>) -> Result<General<T>, ()> {
        let mut b: General<T> = a;
        let rows = self.matrix.nrows();

        for k in (0..rows).rev() {
            for l in (k + 1..rows).rev() {
                b.set_row(&(b.get_row(k) - (b.get_row(l) * self[[k, l]])), k);
            }
        }
        Ok(b)
    }
}