From 56222e04f1679fcf22b6948a9c9e2911d943eb93 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Sat, 27 May 2023 01:28:01 -0500 Subject: [PATCH] new: Added diagonal_matrix method --- src/lib.rs | 48 +++++++++++++++++++++++++++++------------------- src/tests.rs | 3 ++- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2107544..8b70675 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -97,7 +97,7 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1,2,3],vec![4,5,6]]).unwrap(); + /// let m = Matrix::from(vec![vec![1,2,3], vec![4,5,6]]).unwrap(); /// let n = Matrix::from(vec![vec![5,6]]).unwrap(); /// assert_eq!(m.submatrix(0,0),n); /// ``` @@ -125,7 +125,7 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1,2],vec![3,4]]).unwrap(); + /// let m = Matrix::from(vec![vec![1,2], vec![3,4]]).unwrap(); /// assert_eq!(m.det(),Ok(-2)); /// ``` pub fn det(&self) -> Result { @@ -160,7 +160,7 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1.0,2.0],vec![3.0,4.0]]).unwrap(); + /// let m = Matrix::from(vec![vec![1.0,2.0], vec![3.0,4.0]]).unwrap(); /// assert_eq!(m.det(),Ok(-2.0)); /// ``` pub fn det_in_field(&self) -> Result @@ -211,7 +211,7 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1.0,2.0,3.0],vec![3.0,4.0,5.0]]).unwrap(); + /// let m = Matrix::from(vec![vec![1.0,2.0,3.0], vec![3.0,4.0,5.0]]).unwrap(); /// let n = Matrix::from(vec![vec![1.0,2.0,3.0], vec![0.0,-2.0,-4.0]]).unwrap(); /// assert_eq!(m.row_echelon(),n); /// ``` @@ -269,7 +269,7 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1.0,2.0,3.0],vec![3.0,4.0,5.0]]).unwrap(); + /// let m = Matrix::from(vec![vec![1.0,2.0,3.0], vec![3.0,4.0,5.0]]).unwrap(); /// let n = Matrix::from(vec![vec![1.0,2.0,3.0], vec![0.0,1.0,2.0]]).unwrap(); /// assert_eq!(m.reduced_row_echelon(),n); /// ``` @@ -312,19 +312,11 @@ impl + Add + Sub + Zero + Copy> Matri where T: One, { - let mut out = Vec::new(); - for i in 0..size { - let mut new_row = Vec::new(); - for j in 0..size { - if i == j { - new_row.push(T::one()); - } else { - new_row.push(T::zero()); - } - } - out.push(new_row); + let mut out = Matrix::zero(size, size); + for (i, row) in out.entries.iter_mut().enumerate() { + row[i] = T::one(); } - Matrix { entries: out } + out } /// Returns the trace of a square matrix. @@ -332,8 +324,8 @@ impl + Add + Sub + Zero + Copy> Matri /// # Example /// ``` /// use matrix_basic::Matrix; - /// let m = Matrix::from(vec![vec![1,2],vec![3,4]]).unwrap(); - /// assert_eq!(m.det(),Ok(-2)); + /// let m = Matrix::from(vec![vec![1,2], vec![3,4]]).unwrap(); + /// assert_eq!(m.trace(),Ok(5)); /// ``` pub fn trace(self) -> Result { if self.is_square() { @@ -347,6 +339,24 @@ impl + Add + Sub + Zero + Copy> Matri } } + /// Returns a diagonal matrix with a given diagonal. + /// # Example + /// ``` + /// use matrix_basic::Matrix; + /// let m = Matrix::diagonal_matrix(vec![1,2,3]); + /// let n = Matrix::from(vec![vec![1,0,0], vec![0,2,0], vec![0,0,3]]).unwrap(); + /// + /// assert_eq!(m,n); + /// ``` + pub fn diagonal_matrix(diag: Vec) -> Self { + let size = diag.len(); + let mut out = Matrix::zero(size, size); + for (i, row) in out.entries.iter_mut().enumerate() { + row[i] = diag[i]; + } + out + } + // TODO: Canonical forms, eigenvalues, eigenvectors etc. } diff --git a/src/tests.rs b/src/tests.rs index b82a454..01fb5d1 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -41,12 +41,13 @@ fn det_trace_test() { } #[test] -fn zero_one_test() { +fn zero_one_diag_test() { let a = Matrix::from(vec![vec![0, 0, 0], vec![0, 0, 0]]).unwrap(); let b = Matrix::from(vec![vec![1, 0], vec![0, 1]]).unwrap(); assert_eq!(Matrix::::zero(2, 3), a); assert_eq!(Matrix::::identity(2), b); + assert_eq!(Matrix::diagonal_matrix(vec![1, 1]), b); } #[test]