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}