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:
@@ -47,8 +47,19 @@ impl<const H: usize, const W: usize> Matrix<H, W> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn determinant(&self) -> f32 {
|
pub fn determinant(&self) -> f32 where
|
||||||
self.matrix[0][0] * self.matrix[1][1] - self.matrix[0][1] * self.matrix[1][0]
|
[(); 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 {
|
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 m = self.sub_matrix(row, col);
|
||||||
let b = self.bound_skip(row, H - 1);
|
let det = m.determinant();
|
||||||
let l = self.zero_skip(col);
|
det
|
||||||
let r = self.bound_skip(col, 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 tl = self.matrix[t][l];
|
// let tl = self.matrix[t][l];
|
||||||
let br = self.matrix[b][r];
|
// let br = self.matrix[b][r];
|
||||||
let tr = self.matrix[t][r];
|
// let tr = self.matrix[t][r];
|
||||||
let bl = self.matrix[b][l];
|
// 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);
|
let minor = self.minor(row, col);
|
||||||
if row + col % 1 == 0 {
|
if (row + col) & 0x1 == 0 {
|
||||||
minor
|
minor
|
||||||
} else {
|
} else {
|
||||||
minor * -1.0
|
minor * -1.0
|
||||||
@@ -457,6 +478,34 @@ mod tests {
|
|||||||
assert_eq!(-12.0, m.cofactor(0, 0));
|
assert_eq!(-12.0, m.cofactor(0, 0));
|
||||||
assert_eq!(25.0, m.minor(1, 0));
|
assert_eq!(25.0, m.minor(1, 0));
|
||||||
assert_eq!(-25.0, m.cofactor(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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user