[][src]Struct aljabar::Matrix

#[repr(transparent)]pub struct Matrix<T, const N: usize, const M: usize>(_);

An N-by-M Column Major matrix.

Matrices can be created from arrays of Vectors of any size and scalar type. As with Vectors there are convenience constructor functions for square matrices of the most common sizes.

This example is not tested
let a = Matrix::<f32, 3, 3>::from( [ vector!( 1.0, 0.0, 0.0 ),
                                     vector!( 0.0, 1.0, 0.0 ),
                                     vector!( 0.0, 0.0, 1.0 ), ] );
let b: Matrix::<i32, 3, 3> = matrix![
    [ 0, -3, 5 ],
    [ 6, 1, -4 ],
    [ 2, 3, -2 ]
];

All operations performed on matrices produce fixed-size outputs. For example, taking the transpose of a non-square matrix will produce a matrix with the width and height swapped:

This example is not tested
assert_eq!(
    Matrix::<i32, 1, 2>::from( [ vector!( 1 ), vector!( 2 ) ] )
        .transpose(),
    Matrix::<i32, 2, 1>::from( [ vector!( 1, 2 ) ] )
);

Indexing

Matrices can be indexed by either their native column major storage or by the more natural row major method. In order to use row-major indexing, call .index or .index_mut on the matrix with a pair of indices. Calling .index with a single index will produce a vector representing the appropriate column of the matrix.

let m: Matrix::<i32, 2, 2> = matrix![
    [ 0, 2 ],
    [ 1, 3 ],
];

// Column-major indexing:
assert_eq!(m[0][0], 0);
assert_eq!(m[0][1], 1);
assert_eq!(m[1][0], 2);
assert_eq!(m[1][1], 3);

// Row-major indexing:
assert_eq!(m[(0, 0)], 0);
assert_eq!(m[(1, 0)], 1);
assert_eq!(m[(0, 1)], 2);
assert_eq!(m[(1, 1)], 3);

Iterating

Matrices are iterated most naturally over their columns, for which the following three functions are provided:

Matrices can also be iterated over by their rows, however they can only be iterated over by RowViews, as they are not the natural storage for Matrices. The following functions are provided:

  • row_iter, for immutably iterating over row views.
  • row_iter_mut, for mutably iterating over row views (RowViewMut).
  • In order to take ownership of the rows of the matrix, into_iter should called on the result of a transpose.

Implementations

impl<T, const N: usize, const M: usize> Matrix<T, { N }, { M }>[src]

pub fn swap_columns(&mut self, a: usize, b: usize)[src]

Swap the two given columns in-place.

pub fn swap_rows(&mut self, a: usize, b: usize)[src]

Swap the two given rows in-place.

pub fn swap_elements(
    &mut self,
    (acol, arow): (usize, usize),
    (bcol, brow): (usize, usize)
)
[src]

Swap the two given elements at index a and index b.

The indices are expressed in the form (column, row), which may be confusing given the indexing strategy for matrices.

pub fn column_iter<'a>(&'a self) -> impl Iterator<Item = &'a Vector<T, { N }>>[src]

Returns an immutable iterator over the columns of the matrix.

pub fn column_iter_mut<'a>(
    &'a mut self
) -> impl Iterator<Item = &'a mut Vector<T, { N }>>
[src]

Returns a mutable iterator over the columns of the matrix.

pub fn row_iter<'a>(
    &'a self
) -> impl Iterator<Item = RowView<'a, T, { N }, { M }>>
[src]

Returns an immutable iterator over the rows of the matrix.

pub fn row_iter_mut<'a>(
    &'a mut self
) -> impl Iterator<Item = RowViewMut<'a, T, { N }, { M }>>
[src]

Returns a mutable iterator over the rows of the matrix

pub fn map<Out, F>(self, f: F) -> Matrix<Out, { N }, { M }> where
    F: FnMut(T) -> Out, 
[src]

Applies the given function to each element of the matrix, constructing a new matrix with the returned outputs.

pub fn transpose(self) -> Matrix<T, { M }, { N }>[src]

Returns the transpose of the matrix.

impl<T, const N: usize> Matrix<T, { N }, { N }> where
    T: Clone
[src]

pub fn diagonal(&self) -> Vector<T, { N }>[src]

Return the diagonal of the matrix. Only available for square matrices.

impl<T, const N: usize> Matrix<T, { N }, { N }> where
    T: Clone + PartialOrd + Product + Real + One + Zero,
    T: Neg<Output = T>,
    T: Add<T, Output = T> + Sub<T, Output = T>,
    T: Mul<T, Output = T> + Div<T, Output = T>,
    Self: Add<Self>,
    Self: Sub<Self>,
    Self: Mul<Self>,
    Self: Mul<Vector<T, { N }>, Output = Vector<T, { N }>>, 
[src]

pub fn lu(self) -> Option<LU<T, { N }>>[src]

Returns the LU decomposition of the matrix, if one exists.

pub fn determinant(&self) -> T[src]

Returns the determinant of the matrix.

pub fn invert(self) -> Option<Self>[src]

Attempt to invert the matrix. For square matrices greater in size than three, LU decomposition is guaranteed to be used.

Trait Implementations

impl<A, B, const N: usize, const M: usize> Add<Matrix<B, N, M>> for Matrix<A, { N }, { M }> where
    A: Add<B>, 
[src]

Element-wise addition of two equal sized matrices.

type Output = Matrix<<A as Add<B>>::Output, { N }, { M }>

The resulting type after applying the + operator.

impl<A, B, const N: usize, const M: usize> AddAssign<Matrix<B, N, M>> for Matrix<A, { N }, { M }> where
    A: AddAssign<B>, 
[src]

impl<T, const N: usize, const M: usize> Clone for Matrix<T, { N }, { M }> where
    T: Clone
[src]

impl<T, const N: usize, const M: usize> Copy for Matrix<T, { N }, { M }> where
    T: Copy
[src]

impl<T, const N: usize, const M: usize> Debug for Matrix<T, { N }, { M }> where
    T: Debug
[src]

I'm not quite sure how to format the debug output for a matrix.

impl<T, const N: usize, const M: usize> Deref for Matrix<T, { N }, { M }>[src]

type Target = [Vector<T, { N }>; M]

The resulting type after dereferencing.

impl<T, const N: usize, const M: usize> DerefMut for Matrix<T, { N }, { M }>[src]

impl<'de, T, const N: usize, const M: usize> Deserialize<'de> for Matrix<T, { N }, { M }> where
    T: Deserialize<'de>, 
[src]

impl<T, const N: usize, const M: usize> Distribution<Matrix<T, N, M>> for Standard where
    Standard: Distribution<Vector<T, { N }>>, 
[src]

impl<T, const N: usize, const M: usize> From<[[T; N]; M]> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize, const M: usize> From<[Vector<T, N>; M]> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize> From<Matrix<T, N, 1_usize>> for Vector<T, { N }>[src]

impl<T, const N: usize, const M: usize> FromIterator<T> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize, const M: usize> FromIterator<Vector<T, N>> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize, const M: usize> Hash for Matrix<T, { N }, { M }> where
    T: Hash
[src]

impl<T, const N: usize, const M: usize> Index<(usize, usize)> for Matrix<T, { N }, { M }>[src]

type Output = T

The returned type after indexing.

impl<T, const N: usize, const M: usize> Index<usize> for Matrix<T, { N }, { M }>[src]

type Output = Vector<T, { N }>

The returned type after indexing.

impl<T, const N: usize, const M: usize> IndexMut<(usize, usize)> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize, const M: usize> IndexMut<usize> for Matrix<T, { N }, { M }>[src]

impl<T, const N: usize, const M: usize> IntoIterator for Matrix<T, { N }, { M }>[src]

type Item = Vector<T, { N }>

The type of the elements being iterated over.

type IntoIter = ArrayIter<Vector<T, { N }>, { M }>

Which kind of iterator are we turning this into?

impl<T, const N: usize, const M: usize, const P: usize> Mul<Matrix<T, M, P>> for Matrix<T, { N }, { M }> where
    T: Add<T, Output = T> + Mul<T, Output = T> + Clone,
    Vector<T, { M }>: InnerSpace
[src]

type Output = Matrix<<Vector<T, { M }> as VectorSpace>::Scalar, { N }, { P }>

The resulting type after applying the * operator.

impl<const N: usize, const M: usize> Mul<Matrix<f32, N, M>> for f32[src]

type Output = Matrix<f32, { N }, { M }>

The resulting type after applying the * operator.

impl<const N: usize, const M: usize> Mul<Matrix<f64, N, M>> for f64[src]

type Output = Matrix<f64, { N }, { M }>

The resulting type after applying the * operator.

impl<T, const N: usize, const M: usize> Mul<T> for Matrix<T, { N }, { M }> where
    T: Mul<T, Output = T> + Clone
[src]

Scalar multiply

type Output = Matrix<T, { N }, { M }>

The resulting type after applying the * operator.

impl<T, const N: usize, const M: usize> Mul<Vector<T, M>> for Matrix<T, { N }, { M }> where
    T: Add<T, Output = T> + Mul<T, Output = T> + Clone,
    Vector<T, { M }>: InnerSpace
[src]

type Output = Vector<<Vector<T, { M }> as VectorSpace>::Scalar, { N }>

The resulting type after applying the * operator.

impl<T, const N: usize, const M: usize> Neg for Matrix<T, { N }, { M }> where
    T: Neg
[src]

type Output = Matrix<<T as Neg>::Output, { N }, { M }>

The resulting type after applying the - operator.

impl<T, const N: usize> One for Matrix<T, { N }, { N }> where
    T: Zero + One + Clone,
    Self: PartialEq<Self>, 
[src]

Constructs a unit matrix.

impl<A, B, RHS, const N: usize, const M: usize> PartialEq<RHS> for Matrix<A, { N }, { M }> where
    RHS: Deref<Target = [Vector<B, { N }>; M]>,
    A: PartialEq<B>, 
[src]

impl<T, const N: usize, const M: usize> Serialize for Matrix<T, { N }, { M }> where
    Vector<T, { N }>: Serialize
[src]

impl<A, B, const N: usize, const M: usize> Sub<Matrix<B, N, M>> for Matrix<A, { N }, { M }> where
    A: Sub<B>, 
[src]

Element-wise subtraction of two equal sized matrices.

type Output = Matrix<<A as Sub<B>>::Output, { N }, { M }>

The resulting type after applying the - operator.

impl<A, B, const N: usize, const M: usize> SubAssign<Matrix<B, N, M>> for Matrix<A, { N }, { M }> where
    A: SubAssign<B>, 
[src]

impl<T, const N: usize, const M: usize> Zero for Matrix<T, { N }, { M }> where
    T: Zero,
    Vector<T, { N }>: Zero
[src]

Auto Trait Implementations

impl<T, const N: usize, const M: usize> RefUnwindSafe for Matrix<T, N, M> where
    T: RefUnwindSafe

impl<T, const N: usize, const M: usize> Send for Matrix<T, N, M> where
    T: Send

impl<T, const N: usize, const M: usize> Sync for Matrix<T, N, M> where
    T: Sync

impl<T, const N: usize, const M: usize> Unpin for Matrix<T, N, M> where
    T: Unpin

impl<T, const N: usize, const M: usize> UnwindSafe for Matrix<T, N, M> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

type IntoIter = I

Which kind of iterator are we turning this into?

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,