1use crate::Matrix;
2use std::error::Error;
3
4impl<T> Matrix<T>
5where T: std::ops::Mul<Output=T> + Clone {
6
7 pub fn cofactors(&self, neg_one: T) -> Result<Matrix<T>, Box<dyn Error>> {
8
9 let (rows, columns) = self.dimensions()?;
10
11 if rows == columns {
12
13 let mut cofactors_matrix = Matrix(vec![vec![]; rows]);
14
15 for i in 0..rows {
16
17 for j in 0..columns {
18
19 let i_plus_j = i + j;
20
21 let rem = i_plus_j % 2;
22
23 if rem == 0 {
24
25 cofactors_matrix.0[i].push(self.0[i][j].clone());
26
27 } else {
28
29 let cofactor = neg_one.clone() * self.0[i][j].clone();
30
31 cofactors_matrix.0[i].push(cofactor);
32
33 }
34
35 }
36
37 }
38
39 Ok(cofactors_matrix)
40
41 } else {
42
43 Err("Non Square matrix!")?
44 }
45
46 }
47
48}
49
50#[cfg(test)]
51mod tests {
52
53 use super::*;
54
55 #[test]
56 fn test_matrix_cofactors_0() {
57
58 let a = Matrix(vec![vec![3,-1,-2], vec![3,1,-1], vec![3,4,2]]);
59
60 let i = Matrix(vec![vec![3,1,-2], vec![-3,1,1], vec![3,-4,2]]);
61
62 assert_eq!(a.cofactors(-1).unwrap(), i)
63
64 }
65
66 #[test]
67 fn test_matrix_cofactors_1() {
68
69 let m = Matrix(vec![vec![33,-6,-27], vec![12,-12,-12], vec![-3,-6,-3]]);
70
71 let c = Matrix(vec![vec![33,6,-27], vec![-12,-12,12], vec![-3,6,-3]]);
72
73 assert_eq!(m.cofactors(-1).unwrap(), c)
74
75 }
76
77 #[test]
78 fn test_matrix_cofactors_3() {
79
80 let m = Matrix(vec![vec![3,4], vec![-2,1]]);
81
82 let c = Matrix(vec![vec![3,-4], vec![2,1]]);
83
84 assert_eq!(m.cofactors(-1).unwrap(), c)
85
86 }
87
88}