1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use na::allocator::Allocator;
use na::{DefaultAllocator, DimName, MatrixMN, Scalar};

use {Dual, Float, Zero};

pub fn norm<T: Scalar + Float, M: DimName, N: DimName>(v: &MatrixMN<Dual<T>, M, N>) -> Dual<T>
where
    Dual<T>: Float,
    DefaultAllocator: Allocator<Dual<T>, N> + Allocator<Dual<T>, M, N>,
{
    let mut val = Dual::zero();

    for i in 0..M::dim() {
        for j in 0..N::dim() {
            val = val + v[(i, j)].powi(2);
        }
    }

    val.sqrt()
}