opis/matrix/
trace.rs

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}