diff --git a/matrix/src/lib.rs b/matrix/src/lib.rs index 4eafa95..76ca8a1 100644 --- a/matrix/src/lib.rs +++ b/matrix/src/lib.rs @@ -51,11 +51,37 @@ impl Matrix { self.matrix[0][0] * self.matrix[1][1] - self.matrix[0][1] * self.matrix[1][0] } + fn zero_skip(&self, val: usize) -> usize { + if val == 0 { + 1 + } else { + 0 + } + } + + fn bound_skip(&self, val: usize, bound: usize) -> usize { + if val < bound { + bound + } else { + bound - 1 + } + } + pub fn minor(&self, row: usize, col: usize) -> f32 where [(); H - 1]: , [(); W - 1]: , { - self.sub_matrix(row, col).determinant() + let t = self.zero_skip(row); + let b = self.bound_skip(row, H - 1); + let l = self.zero_skip(col); + let r = self.bound_skip(col, W - 1); + + let tl = self.matrix[t][l]; + let br = self.matrix[b][r]; + let tr = self.matrix[t][r]; + let bl = self.matrix[b][l]; + + tl * br - tr * bl } pub fn sub_matrix(&self, skip_row: usize, skip_col: usize) -> Matrix<{H - 1}, {W - 1}>