determinants can not function

const_generics are not done and I can not use 2 methods in one due to the errors
This commit is contained in:
Jon Janzen
2021-04-02 15:58:25 -06:00
parent 02c557c4a3
commit 75f882f860

View File

@@ -47,8 +47,19 @@ impl<const H: usize, const W: usize> Matrix<H, W> {
}
}
pub fn determinant(&self) -> f32 {
self.matrix[0][0] * self.matrix[1][1] - self.matrix[0][1] * self.matrix[1][0]
pub fn determinant(&self) -> f32 where
[(); H - 1]: ,
[(); W - 1]: ,
{
if W == 2 {
self.matrix[0][0] * self.matrix[1][1] - self.matrix[0][1] * self.matrix[1][0]
} else {
let mut sum = 0.0;
for (col, val) in self.matrix[0].iter().enumerate().take(W) {
sum += val * self.cofactor(0, col);
}
sum
}
}
fn zero_skip(&self, val: usize) -> usize {
@@ -67,24 +78,34 @@ impl<const H: usize, const W: usize> Matrix<H, W> {
}
}
pub fn minor(&self, row: usize, col: usize) -> f32
pub fn minor(&self, row: usize, col: usize) -> f32 where
[(); H - 1]: ,
[(); W - 1]: ,
[(); H - 1]: ,
[(); W - 1]: ,
{
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 m = self.sub_matrix(row, col);
let det = m.determinant();
det
// 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];
// 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
// tl * br - tr * bl
}
pub fn cofactor(&self, row: usize, col: usize) -> f32 {
pub fn cofactor(&self, row: usize, col: usize) -> f32 where
[(); H - 1]: ,
[(); W - 1]: ,
{
let minor = self.minor(row, col);
if row + col % 1 == 0 {
if (row + col) & 0x1 == 0 {
minor
} else {
minor * -1.0
@@ -457,6 +478,34 @@ mod tests {
assert_eq!(-12.0, m.cofactor(0, 0));
assert_eq!(25.0, m.minor(1, 0));
assert_eq!(-25.0, m.cofactor(1, 0));
}
#[test]
fn determinant_3x3() {
let m = Matrix::from_array([
[1.0, 2.0, 6.0],
[-5.0, 8.0, -4.0],
[2.0, 6.0, 4.0],
]);
assert_eq!(56.0, m.cofactor(0, 0));
assert_eq!(12.0, m.cofactor(0, 1));
assert_eq!(-46.0, m.cofactor(0, 2));
assert_eq!(-196.0, m.determinant());
}
#[test]
fn determinant_4x4() {
let m = Matrix::from_array([
[-2.0, -8.0, 3.0, 5.0],
[-3.0, 1.0, 7.0, 3.0],
[1.0, 2.0, -9.0, 6.0],
[-6.0, 7.0, 7.0, -9.0],
]);
assert_eq!(690.0, m.cofactor(0, 0));
assert_eq!(447.0, m.cofactor(0, 1));
assert_eq!(210.0, m.cofactor(0, 2));
assert_eq!(51.0, m.cofactor(0, 3));
assert_eq!(-4071.0, m.determinant());
}
}