1use std::error::Error;
2
3use crate::Matrix;
4
5impl<T> Matrix<T>
6
7where T: std::ops::Add<Output=T> + Clone {
8
9 pub fn trace(&self) -> Result<T, Box<dyn Error>> {
10
11 let (rows, columns) = self.dimensions()?;
12
13 if rows == columns {
14
15 Ok((1..rows)
16 .into_iter()
17 .fold(
18 self.0[0][0].clone(),
19 |acc, x|
20 acc + self.0[x][x].clone()
21 )
22 )
23
24 } else {
25
26 Err("Non Square matrix!")?
27
28 }
29
30 }
31
32}
33
34#[cfg(test)]
35mod tests {
36
37 use super::*;
38 #[test]
39 fn test_matrix_trace() {
40
41 let a = Matrix(vec![vec![-1,2,7,0], vec![3,5,-8,4], vec![1,2,7,-3], vec![4,-2,1,0]]);
42
43 assert_eq!(a.trace().unwrap(), 11)
44
45 }
46
47}