use crate::matrix::Matrix;
impl Matrix<2, 2> {
pub fn det(&self) -> f64 {
(self.matrix[0] * self.matrix[3]) - (self.matrix[1] * self.matrix[2])
}
pub fn inv(&self) -> Self {
let mut matrix: Vec<f64> = (0..4).map(|f| self.matrix[f]).collect();
matrix.swap(0, 3);
matrix[1] *= -1.0;
matrix[2] *= -1.0;
let mut matrix = Matrix::new(matrix).unwrap();
matrix.scalar_multiply(1.0 / self.det());
matrix
}
}
#[cfg(test)]
mod test_matrix_2x2_ops {
use super::*;
#[test]
fn test_determinant() {
let data = vec![1.0, 2.0, 3.0, 4.0];
let matrix: Matrix<2, 2> = Matrix::new(data).unwrap();
assert_eq!(matrix.det(), -2.0)
}
#[test]
fn test_inverse() {
let data = vec![1.0, 2.0, 3.0, 4.0];
let matrix: Matrix<2, 2> = Matrix::new(data).unwrap();
let inverse = matrix.inv();
assert_eq!((matrix.multiply(&inverse)).matrix, [1.0, 0.0, 0.0, 1.0]);
}
}