ndarray-linalg 0.1.2

Linear algebra package for rust-ndarray using LAPACK
Documentation

extern crate ndarray;
extern crate ndarray_linalg;
extern crate num_traits;

use ndarray::prelude::*;
use ndarray_linalg::prelude::*;
use num_traits::float::Float;

fn assert_almost_eq(a: f64, b: f64) {
    let rel_dev = (a - b).abs() / (a.abs() + b.abs());
    if rel_dev > 1.0e-7 {
        panic!("a={:?}, b={:?} are not almost equal", a, b);
    }
}

#[test]
fn vector_norm() {
    let a = Array::range(1., 10., 1.);
    assert_almost_eq(a.norm(), 285.0.sqrt());
}

#[test]
fn matrix_norm_square() {
    let a = Array::range(1., 10., 1.).into_shape((3, 3)).unwrap();
    assert_almost_eq(a.norm_1(), 18.0);
    assert_almost_eq(a.norm_i(), 24.0);
    assert_almost_eq(a.norm_f(), 285.0.sqrt());
}

#[test]
fn matrix_norm_square_t() {
    let a = Array::range(1., 10., 1.).into_shape((3, 3)).unwrap().reversed_axes();
    assert_almost_eq(a.norm_1(), 24.0);
    assert_almost_eq(a.norm_i(), 18.0);
    assert_almost_eq(a.norm_f(), 285.0.sqrt());
}

#[test]
fn matrix_norm_3x4() {
    let a = Array::range(1., 13., 1.).into_shape((3, 4)).unwrap();
    assert_almost_eq(a.norm_1(), 24.0);
    assert_almost_eq(a.norm_i(), 42.0);
    assert_almost_eq(a.norm_f(), 650.0.sqrt());
}

#[test]
fn matrix_norm_3x4_t() {
    let a = Array::range(1., 13., 1.)
        .into_shape((3, 4))
        .unwrap()
        .reversed_axes();
    assert_almost_eq(a.norm_1(), 42.0);
    assert_almost_eq(a.norm_i(), 24.0);
    assert_almost_eq(a.norm_f(), 650.0.sqrt());
}

#[test]
fn matrix_norm_4x3() {
    let a = Array::range(1., 13., 1.).into_shape((4, 3)).unwrap();
    assert_almost_eq(a.norm_1(), 30.0);
    assert_almost_eq(a.norm_i(), 33.0);
    assert_almost_eq(a.norm_f(), 650.0.sqrt());
}

#[test]
fn matrix_norm_4x3_t() {
    let a = Array::range(1., 13., 1.)
        .into_shape((4, 3))
        .unwrap()
        .reversed_axes();
    assert_almost_eq(a.norm_1(), 33.0);
    assert_almost_eq(a.norm_i(), 30.0);
    assert_almost_eq(a.norm_f(), 650.0.sqrt());
}