opis/matrix/
minors.rs

1use std::error::Error;
2use crate::Matrix;
3
4impl<T> Matrix<T>
5where T: std::ops::Mul<Output=T> + std::ops::Sub<Output=T> + Clone + std::ops::Add<Output = T> + std::fmt::Debug {
6
7   pub fn minors(&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 minors_matrix = Matrix(vec![vec![]; rows]);
14
15         for row in 0..rows {
16
17            for column in 0..columns {
18
19               let minor_matrix = self.submatrix(row, column)?;
20
21               let minor = minor_matrix.determinant(neg_one.clone())?;
22
23               minors_matrix.0[row].push(minor)
24
25            }
26
27         }
28
29         Ok(minors_matrix)
30
31      } else {
32         
33         Err("Non Square matrix!")?
34         
35      }
36
37   }
38    
39}
40
41#[cfg(test)]
42mod tests {
43   
44   use super::*;
45   
46   #[test]
47   fn test_matrix_minors() {
48      
49      let a = Matrix(vec![vec![2,3,3], vec![2,4,5], vec![1,1,2]]);
50
51      let m = Matrix(vec![vec![3,-1,-2], vec![3,1,-1], vec![3,4,2]]);
52      
53      assert_eq!(a.minors(-1).unwrap(), m)
54   
55   }
56
57   #[test]
58   fn test_matrix_minors_1() {
59      
60      let a = Matrix(vec![vec![1,2,3], vec![4,5,6], vec![7,2,9]]);
61
62      let m = Matrix(vec![vec![33,-6,-27], vec![12,-12,-12], vec![-3,-6,-3]]);
63      
64      assert_eq!(a.minors(-1).unwrap(), m)
65   
66   }
67
68}