1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
use crate::Matrix;
use super::det::Det;
use super::submatrix::Submatrix;
pub trait Minor: Matrix
{
type Index;
type Output;
/// Returns the determinant of the submatrix of a given cell
///
/// |Mᵢⱼ|
///
/// # Arguments
///
/// * `index` - Row and/or collumn to neglect
///
/// # Examples
///
/// ```rust
/// let a = [
/// [1.0, 2.0, 3.0],
/// [4.0, 5.0, 6.0],
/// [7.0, 8.0, 9.0]
/// ];
/// let m = [
/// [5.0, 6.0],
/// [8.0, 9.0]
/// ].det();
/// assert_eq!(a.minor((0, 0)), m);
/// ```
fn minor(&self, index: Self::Index) -> Self::Output;
}
impl<F, const N: usize> Minor for [[F; N]; N]
where
Self: Submatrix<[[F; N - 1]; N - 1], Index = (usize, usize)>,
[[F; N - 1]; N - 1]: Det
{
type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
type Output = <[[F; N - 1]; N - 1] as Det>::Output;
fn minor(&self, index: Self::Index) -> Self::Output
{
self.submatrix(index).det()
}
}
/*impl<F, const N: usize> Minor for [[F; N - 1]; N]
where
Self: Submatrix<[[F; N - 1]; N - 1], Index = usize>,
[[F; N - 1]; N - 1]: Det
{
type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
type Output = <[[F; N - 1]; N - 1] as Det>::Output;
fn minor(&self, index: Self::Index) -> Self::Output
{
self.submatrix(index).det()
}
}
impl<F, const N: usize> Minor for [[F; N]; N - 1]
where
Self: Submatrix<[[F; N - 1]; N - 1], Index = usize>,
[[F; N - 1]; N - 1]: Det
{
type Index = <Self as Submatrix<[[F; N - 1]; N - 1]>>::Index;
type Output = <[[F; N - 1]; N - 1] as Det>::Output;
fn minor(&self, index: Self::Index) -> Self::Output
{
self.submatrix(index).det()
}
}*/