pub trait SquareMatrixMath<T, const N: usize>: MatrixMath<T, N, N> {
    // Required methods
    fn inv_matrix(&self) -> Option<[[T; N]; N]>
       where T: Signed + PartialOrd + One + Zero + Copy + SubAssign + DivAssign + AddAssign,
             [(); { _ }]:;
    fn inv_matrix_complex(&self) -> Option<[[T; N]; N]>
       where T: ComplexFloat + SubAssign + DivAssign + AddAssign + Copy,
             [(); { _ }]:;
    fn solve_square_matrix(&self, b: &[T; N]) -> [T; N]
       where T: Signed + Zero + One + PartialOrd + AddAssign + SubAssign + DivAssign + Copy,
             [(); { _ }]:;
    fn solve_square_matrix_complex(&self, b: &[T; N]) -> [T; N]
       where T: ComplexFloat + AddAssign + SubAssign + DivAssign + Copy,
             [(); { _ }]:;
    fn upper_hessenberg_matrix(&self) -> [[T; N]; N]
       where T: ComplexFloat + AddAssign + SubAssign + DivAssign<T::Real> + Div<T::Real, Output = T> + Mul<T::Real, Output = T> + Copy;
    fn eigenvalues(&self) -> [Complex<T::Real>; N]
       where Complex<T::Real>: From<T> + AddAssign + SubAssign + DivAssign<T::Real>,
             T: ComplexFloat;
    fn eigen(&self) -> ([Complex<T::Real>; N], [[Complex<T::Real>; N]; N])
       where Complex<T::Real>: From<T> + AddAssign + SubAssign + DivAssign + DivAssign<T::Real>,
             T: ComplexFloat,
             [(); { _ }]:;
}

Required Methods§

source

fn inv_matrix(&self) -> Option<[[T; N]; N]>

source

fn inv_matrix_complex(&self) -> Option<[[T; N]; N]>

source

fn solve_square_matrix(&self, b: &[T; N]) -> [T; N]

source

fn solve_square_matrix_complex(&self, b: &[T; N]) -> [T; N]

source

fn upper_hessenberg_matrix(&self) -> [[T; N]; N]
where T: ComplexFloat + AddAssign + SubAssign + DivAssign<T::Real> + Div<T::Real, Output = T> + Mul<T::Real, Output = T> + Copy,

source

fn eigenvalues(&self) -> [Complex<T::Real>; N]

Returns the eigenvalues of the given matrix

source

fn eigen(&self) -> ([Complex<T::Real>; N], [[Complex<T::Real>; N]; N])

Returns the eigenvalues and eigenvectors of the given matrix.

The method uses the algorithm described in Convergence of the Shifted QR Algorithm for Unitary Hessenberg Matrices - Tai-Lin Wang and William B. Gragg.

§Examples
use num::Complex;
use array_math::{SquareMatrixMath, MatrixMath, ArrayOps};
 
let a = [
    [Complex::new(1.0, -3.0), Complex::new(2.0, 2.0)],
    [Complex::new(3.0, 1.0), Complex::new(4.0, -4.0)]
];
 
let (e, v) = a.eigen();
 
for (e, v) in e.zip(v)
{
    let av = a.mul_matrix(v.as_collumn()).map(|[av]| av);
    let vlambda = v.mul_all(e);
     
    for (avi, vlambdai) in av.zip(vlambda)
    {
        let d = (avi - vlambdai).norm();
        assert!(d < 1e-10)
    }
}

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl<T, const N: usize> SquareMatrixMath<T, N> for [[T; N]; N]

Implementors§