mirror of
https://github.com/SinTan1729/matrix-basic.git
synced 2024-12-26 13:58:36 -06:00
new: More documentation
This commit is contained in:
parent
3d862393d6
commit
69e2efa37e
1 changed files with 17 additions and 1 deletions
18
src/lib.rs
18
src/lib.rs
|
@ -2,6 +2,8 @@
|
||||||
//! with any type that supports addition, substraction,
|
//! with any type that supports addition, substraction,
|
||||||
//! and multiplication. Additional properties might be
|
//! and multiplication. Additional properties might be
|
||||||
//! needed for certain operations.
|
//! needed for certain operations.
|
||||||
|
//! I created it mostly to learn using generic types
|
||||||
|
//! and traits.
|
||||||
//!
|
//!
|
||||||
//! Sayantan Santra (2023)
|
//! Sayantan Santra (2023)
|
||||||
|
|
||||||
|
@ -27,7 +29,7 @@ pub struct Matrix<T: Mul + Add + Sub> {
|
||||||
|
|
||||||
impl<T: Mul + Add + Sub> Matrix<T> {
|
impl<T: Mul + Add + Sub> Matrix<T> {
|
||||||
/// Creates a matrix from given 2D "array" in a `Vec<Vec<T>>` form.
|
/// Creates a matrix from given 2D "array" in a `Vec<Vec<T>>` form.
|
||||||
/// It'll throw error if all the given rows aren't of the same size.
|
/// It'll throw an error if all the given rows aren't of the same size.
|
||||||
/// # Example
|
/// # Example
|
||||||
/// ```
|
/// ```
|
||||||
/// use matrix::Matrix;
|
/// use matrix::Matrix;
|
||||||
|
@ -125,6 +127,16 @@ impl<T: Mul + Add + Sub> Matrix<T> {
|
||||||
Matrix { entries: out }
|
Matrix { entries: out }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the determinant of a square matrix. This method additionally requires [`Zero`],
|
||||||
|
/// [`One`] and [`Copy`] traits. Also, we need that the [`Mul`] and [`Add`] operations
|
||||||
|
/// return the same type `T`.
|
||||||
|
/// It'll throw an error if the provided matrix isn't square.
|
||||||
|
/// # Example
|
||||||
|
/// ```
|
||||||
|
/// use matrix::Matrix;
|
||||||
|
/// let m = Matrix::from(vec![vec![1,2],vec![3,4]]).unwrap();
|
||||||
|
/// assert_eq!(m.det(),Ok(-2));
|
||||||
|
/// ```
|
||||||
pub fn det(&self) -> Result<T, &'static str>
|
pub fn det(&self) -> Result<T, &'static str>
|
||||||
where
|
where
|
||||||
T: Copy,
|
T: Copy,
|
||||||
|
@ -133,9 +145,12 @@ impl<T: Mul + Add + Sub> Matrix<T> {
|
||||||
T: Zero,
|
T: Zero,
|
||||||
{
|
{
|
||||||
if self.is_square() {
|
if self.is_square() {
|
||||||
|
// It's a recursive algorithm using minors.
|
||||||
|
// TODO: Implement a faster algorithm. Maybe use row reduction for fields.
|
||||||
let out = if self.width() == 1 {
|
let out = if self.width() == 1 {
|
||||||
self.entries[0][0]
|
self.entries[0][0]
|
||||||
} else {
|
} else {
|
||||||
|
// Add the minors multiplied by cofactors.
|
||||||
let n = 0..self.width();
|
let n = 0..self.width();
|
||||||
let mut out = T::zero();
|
let mut out = T::zero();
|
||||||
for i in n {
|
for i in n {
|
||||||
|
@ -198,6 +213,7 @@ impl<T: Debug + Mul + Add + Sub> Display for Matrix<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Mul<Output = T> + Add + Sub + Copy + Zero> Mul for Matrix<T> {
|
impl<T: Mul<Output = T> + Add + Sub + Copy + Zero> Mul for Matrix<T> {
|
||||||
|
// TODO: Implement a faster algorithm. Maybe use row reduction for fields.
|
||||||
type Output = Self;
|
type Output = Self;
|
||||||
fn mul(self, other: Self) -> Self {
|
fn mul(self, other: Self) -> Self {
|
||||||
let width = self.width();
|
let width = self.width();
|
||||||
|
|
Loading…
Reference in a new issue