opis/matrix/
cofactors.rs

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}