Trait array_math::SquareMatrixMath
source · 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§
fn inv_matrix(&self) -> Option<[[T; N]; N]>
fn inv_matrix_complex(&self) -> Option<[[T; N]; N]>
fn solve_square_matrix(&self, b: &[T; N]) -> [T; N]
fn solve_square_matrix_complex(&self, b: &[T; N]) -> [T; N]
fn upper_hessenberg_matrix(&self) -> [[T; N]; N]
sourcefn eigenvalues(&self) -> [Complex<T::Real>; N]
fn eigenvalues(&self) -> [Complex<T::Real>; N]
Returns the eigenvalues of the given matrix
sourcefn eigen(&self) -> ([Complex<T::Real>; N], [[Complex<T::Real>; N]; N])
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.