1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use crate::{matrix::Matrix, number::Number, types::*};

fn trace<T, U>(slf: &Matrix<T, U>) -> U
where
    T: Type,
    U: Number,
{
    (0..slf.rows).into_iter().map(|i| slf[i][i]).sum()
}

macro_rules! implement {
  ( $($t: ty),+ ) => {
      $(
          impl<U: Number> Matrix<$t, U> {
              /// # Trace
              pub fn trace(&self) -> U {
                  trace(self)
              }
          }
      )+
  };
}

implement! {Square, UpperTriangle, LowerTriangle, Diagonal, PositiveDefinite, PositiveSemiDefinite}