Struct Matrix

Source
pub struct Matrix<T, const M: usize, const N: usize> {
    pub store: [[T; N]; M],
}
Expand description

A generic matrix type with M rows and N columns.

§Examples

use mini_matrix::Matrix;

let matrix = Matrix::<f64, 2, 2>::from([[1.0, 2.0], [3.0, 4.0]]);
assert_eq!(matrix.size(), (2, 2));

Fields§

§store: [[T; N]; M]

The underlying storage for the matrix elements.

Implementations§

Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default,

Source

pub fn from(data: [[T; N]; M]) -> Self

Creates a new Matrix from the given 2D array.

§Examples
use mini_matrix::Matrix;

let matrix = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
Source

pub const fn size(&self) -> (usize, usize)

Returns the dimensions of the matrix as a tuple (rows, columns).

§Examples
use mini_matrix::Matrix;

let matrix = Matrix::<f64, 3, 4>::zero();
assert_eq!(matrix.size(), (3, 4));
Source

pub fn zero() -> Self

Creates a new Matrix with all elements set to the default value of type T.

§Examples
use mini_matrix::Matrix;

let matrix = Matrix::<f64, 2, 2>::zero();
assert_eq!(matrix.store, [[0.0, 0.0], [0.0, 0.0]]);
Source

pub fn from_vecs(vecs: Vec<Vec<T>>) -> Self

Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>

Source

pub fn add(&mut self, other: &Self)

Adds another matrix to this matrix in-place.

§Examples
use mini_matrix::Matrix;

let mut a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let b = Matrix::<i32, 2, 2>::from([[5, 6], [7, 8]]);
a.add(&b);
assert_eq!(a.store, [[6, 8], [10, 12]]);
Source

pub fn sub(&mut self, other: &Self)

Subtracts another matrix from this matrix in-place.

§Examples
use mini_matrix::Matrix;

let mut a = Matrix::<i32, 2, 2>::from([[5, 6], [7, 8]]);
let b = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
a.sub(&b);
assert_eq!(a.store, [[4, 4], [4, 4]]);
Source

pub fn scl(&mut self, scalar: T)

Multiplies this matrix by a scalar value in-place.

§Examples
use mini_matrix::Matrix;

let mut a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
a.scl(2);
assert_eq!(a.store, [[2, 4], [6, 8]]);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Num + Copy + AddAssign + Default,

Source

pub fn mul_vec(&mut self, vec: &Vector<T, N>) -> Vector<T, N>

Multiplies the matrix by a vector.

§Arguments
  • vec - The vector to multiply with the matrix.
§Returns

The resulting vector of the multiplication.

Source

pub fn mul_mat(&mut self, mat: &Matrix<T, M, N>) -> Matrix<T, M, N>

Multiplies the matrix by another matrix.

§Arguments
  • mat - The matrix to multiply with.
§Returns

The resulting matrix of the multiplication.

Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Num + Copy + AddAssign + Default,

Source

pub fn trace(&self) -> T

Calculates the trace of the matrix.

The trace is defined as the sum of the elements on the main diagonal.

§Panics

Panics if the matrix is not square (i.e., if M != N).

§Examples
use mini_matrix::Matrix;

let mut a = Matrix::<i32, 3, 3>::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
assert_eq!(a.trace(), 15);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default,

Source

pub fn transpose(&mut self) -> Matrix<T, N, M>

Computes the transpose of the matrix.

§Examples
use mini_matrix::Matrix;

let mut a = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let b = a.transpose();
assert_eq!(b.store, [[1, 4], [2, 5], [3, 6]]);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Num,

Source

pub fn identity() -> Matrix<T, M, N>

Creates an identity matrix.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 3, 3>::identity();
assert_eq!(a.store, [[1, 0, 0], [0, 1, 0], [0, 0, 1]]);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Mul<Output = T> + PartialEq + Num + Div<Output = T> + Sub<Output = T>,

Source

pub fn row_echelon(&self) -> Matrix<T, M, N>

Converts a given matrix to its Reduced Row-Echelon Form (RREF).

Row-echelon form is a specific form of a matrix that is particularly useful for solving systems of linear equations and for understanding the properties of the matrix. To explain it simply and in detail, let’s go through what row-echelon form is, how to achieve it, and an example to illustrate the process.

§Row-Echelon Form

A matrix is in row-echelon form if it satisfies the following conditions:

  1. Leading Entry: The leading entry (first non-zero number from the left) in each row is 1. This is called the pivot.
  2. Zeros Below: The pivot in each row is to the right of the pivot in the row above, and all entries below a pivot are zeros.
  3. Rows of Zeros: Any rows consisting entirely of zeros are at the bottom of the matrix.
§Reduced Row-Echelon Form

A matrix is in reduced row-echelon form (RREF) if it additionally satisfies:

  1. Leading Entries: Each leading 1 is the only non-zero entry in its column.
§Achieving Row-Echelon Form

To convert a matrix into row-echelon form, we use a process called Gaussian elimination. This involves performing row operations:

  1. Row swapping: Swapping the positions of two rows.
  2. Row multiplication: Multiplying all entries of a row by a non-zero scalar.
  3. Row addition: Adding or subtracting the multiples of one row to another row.

Let’s consider an example with a 3 x 3 matrix:

A = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

§Step-by-Step Process
  1. Starting Matrix:

    [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

  2. Make the Pivot of Row 1 (already 1):

    The first leading entry is already 1.

  3. Eliminate Below Pivot in Column 1:

    Subtract 4 times the first row from the second row:

 R2 = R2 - 4R1
 [
   [1, 2, 3],
   [0, -3, -6],
   [7, 8, 9]
 ]

Subtract 7 times the first row from the third row:

  R3 = R3 - 7R1
  [
    [1, 2, 3],
    [0, -3, -6],
    [0, -6, -12]
  ]
  1. Make the Pivot of Row 2:

    Divide the second row by -3 to make the pivot 1:

   R2 = (1 / -3) * R2
   [
     [1, 2, 3],
     [0, 1, 2],
     [0, -6, -12]
   ]

5. **Eliminate Below Pivot in Column 2**:

   Add 6 times the second row to the third row:
```markdown
   R3 = R3 + 6R2
   [
     [1, 2, 3],
     [0, 1, 2],
     [0, 0, 0]
   ]

Now, the matrix is in row-echelon form.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<f64, 3, 4>::from([
    [1.0, 2.0, 3.0, 4.0],
    [5.0, 6.0, 7.0, 8.0],
    [9.0, 10.0, 11.0, 12.0]
]);
let b = a.row_echelon();
// Check the result (approximate due to floating-point arithmetic)
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Mul + Num + Neg<Output = T> + AddAssign + Debug,

Source

pub fn determinant(&self) -> T

Computes the determinant of the matrix.

§Determinant in General

The determinant is a scalar value that can be computed from the elements of a square matrix. It provides important properties about the matrix and the linear transformation it represents. In general, the determinant represents the scaling factor of the volume when the matrix is used as a linear transformation. It can be positive, negative, or zero, each with different implications:

  • (\det(A) = 0):

    • The matrix A is singular and does not have an inverse.
    • The columns (or rows) of A are linearly dependent.
    • The transformation collapses the space into a lower-dimensional subspace.
    • Geometrically, it indicates that the volume of the transformed space is 0.
  • (\det(A) > 0):

    • The matrix A is non-singular and has an inverse.
    • The transformation preserves the orientation of the space.
    • Geometrically, it indicates a positive scaling factor of the volume.
  • (\det(A) < 0):

    • The matrix A is non-singular and has an inverse.
    • The transformation reverses the orientation of the space.
    • Geometrically, it indicates a negative scaling factor of the volume.
§Example

Consider a 2 x 2 matrix:

A = [
  [1, 2],
  [3, 4]
]

The determinant is:

det(A) = 1 * 4 - 2 * 3 = 4 - 6 = -2

This indicates that the transformation represented by A scales areas by a factor of 2 and reverses their orientation.

§Panics

Panics if the matrix size is larger than 4 x 4.

§Returns

The determinant of the matrix.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 3, 3>::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
assert_eq!(a.determinant(), 0);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Mul + Num + Neg<Output = T> + AddAssign + Debug + Float,

Source

pub fn inverse(&self) -> Result<Self, &'static str>

Calculates the inverse of the matrix.

This method supports matrices up to 3x3 in size.

§Returns

Returns Ok(Matrix) if the inverse exists, or an Err with a descriptive message if not.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<f64, 2, 2>::from([[1.0, 2.0], [3.0, 4.0]]);
let inv = a.inverse().unwrap();
// Check the result (approximate due to floating-point arithmetic)
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Mul + Num + Neg<Output = T> + AddAssign + PartialEq,

Source

pub fn rank(&self) -> usize

Calculates the rank of the matrix.

The rank is determined by computing the row echelon form and counting non-zero rows.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 3, 3>::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
assert_eq!(a.rank(), 2);
Source§

impl<T, const M: usize, const N: usize> Matrix<T, M, N>
where T: Copy + Default + Mul + Num + Neg<Output = T> + AddAssign + PartialEq,

Source

pub fn cofactor2x2(&self, row: usize, col: usize) -> Matrix<T, 2, 2>

Source

pub fn cofactor1x1(&self, row: usize, col: usize) -> Matrix<T, 1, 1>

Trait Implementations§

Source§

impl<T, const M: usize, const N: usize> Add for Matrix<T, M, N>
where T: AddAssign + Copy + Num,

Source§

fn add(self, rhs: Self) -> Self::Output

Adds two matrices element-wise.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let b = Matrix::<i32, 2, 2>::from([[5, 6], [7, 8]]);
let c = a + b;
assert_eq!(c.store, [[6, 8], [10, 12]]);
Source§

type Output = Matrix<T, M, N>

The resulting type after applying the + operator.
Source§

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

Source§

fn clone(&self) -> Matrix<T, M, N>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

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

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

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

Source§

fn deref(&self) -> &Self::Target

Dereferences the matrix, allowing it to be treated as a slice.

§Note

This implementation is currently unfinished.

§Examples
use mini_matrix::Matrix;

let matrix = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
// Usage example will be available once implementation is complete
Source§

type Target = [[T; N]; M]

The resulting type after dereferencing.
Source§

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

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the matrix, allowing it to be treated as a mutable slice.

§Note

This implementation is currently unfinished.

§Examples
use mini_matrix::Matrix;

let mut matrix = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
// Usage example will be available once implementation is complete
Source§

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

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the matrix for display.

Each row of the matrix is displayed on a new line, with elements separated by commas. Elements are formatted with one decimal place precision.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<f32, 2, 2>::from([[1.0, 2.5], [3.7, 4.2]]);
println!("{}", a);
// Output:
// // [1.0, 2.5]
// // [3.7, 4.2]
Source§

impl<T, const M: usize, const N: usize> Index<(usize, usize)> for Matrix<T, M, N>

Source§

fn index(&self, index: (usize, usize)) -> &Self::Output

Immutably indexes into the matrix, allowing read access to its elements.

§Arguments
  • index - A tuple (row, column) specifying the element to access.
§Examples
use mini_matrix::Matrix;

let matrix = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
assert_eq!(matrix[(1, 0)], 3);
Source§

type Output = T

The returned type after indexing.
Source§

impl<T, const M: usize, const N: usize> IndexMut<(usize, usize)> for Matrix<T, M, N>

Source§

fn index_mut(&mut self, index: (usize, usize)) -> &mut T

Mutably indexes into the matrix, allowing modification of its elements.

§Arguments
  • index - A tuple (row, column) specifying the element to access.
§Examples
use mini_matrix::Matrix;

let mut matrix = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
matrix[(0, 1)] = 5;
assert_eq!(matrix.store, [[1, 5], [3, 4]]);
Source§

impl<T, const M: usize, const N: usize> Mul<Matrix<T, N, N>> for Matrix<T, M, N>
where T: MulAssign + AddAssign + Copy + Num + Default,

Source§

fn mul(self, rhs: Matrix<T, N, N>) -> Self::Output

Multiplies two matrices.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let b = Matrix::<i32, 2, 2>::from([[5, 6], [7, 8]]);
let c = a * b;
assert_eq!(c.store, [[17, 23], [39, 53]]);
Source§

type Output = Matrix<T, M, N>

The resulting type after applying the * operator.
Source§

impl<T, const M: usize, const N: usize> Mul<T> for Matrix<T, M, N>
where T: MulAssign + Copy + Num,

Source§

fn mul(self, rhs: T) -> Self::Output

Multiplies a matrix by a scalar value.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let b = a * 2;
assert_eq!(b.store, [[2, 4], [6, 8]]);
Source§

type Output = Matrix<T, M, N>

The resulting type after applying the * operator.
Source§

impl<T, const M: usize, const N: usize> Mul<Vector<T, N>> for Matrix<T, M, N>
where T: MulAssign + AddAssign + Copy + Num + Default,

Source§

fn mul(self, rhs: Vector<T, N>) -> Self::Output

Multiplies a matrix by a vector.

§Examples
use mini_matrix::{Matrix, Vector};

let a = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let v = Vector::<i32, 2>::from([5, 6]);
let result = a * v;
assert_eq!(result.store, [17, 39]);
Source§

type Output = Vector<T, M>

The resulting type after applying the * operator.
Source§

impl<T, const M: usize, const N: usize> Neg for Matrix<T, M, N>
where T: Neg<Output = T> + Copy,

Source§

fn neg(self) -> Self::Output

Negates all elements of the matrix.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 2, 2>::from([[1, -2], [-3, 4]]);
let b = -a;
assert_eq!(b.store, [[-1, 2], [3, -4]]);
Source§

type Output = Matrix<T, M, N>

The resulting type after applying the - operator.
Source§

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

Source§

fn eq(&self, other: &Matrix<T, M, N>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T, const M: usize, const N: usize> Sub for Matrix<T, M, N>
where T: SubAssign + Copy + Num,

Source§

fn sub(self, rhs: Self) -> Self::Output

Subtracts one matrix from another element-wise.

§Examples
use mini_matrix::Matrix;

let a = Matrix::<i32, 2, 2>::from([[5, 6], [7, 8]]);
let b = Matrix::<i32, 2, 2>::from([[1, 2], [3, 4]]);
let c = a - b;
assert_eq!(c.store, [[4, 4], [4, 4]]);
Source§

type Output = Matrix<T, M, N>

The resulting type after applying the - operator.
Source§

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

Source§

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

Auto Trait Implementations§

§

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

§

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

§

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

§

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

§

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

§

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

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.