From f24280c866669f579139480e31921dd8c4cb9865 Mon Sep 17 00:00:00 2001 From: Jon Janzen Date: Sun, 28 Mar 2021 18:00:15 -0600 Subject: [PATCH] matrix with equality --- matrix/Cargo.toml | 1 + matrix/src/lib.rs | 96 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/matrix/Cargo.toml b/matrix/Cargo.toml index 18c3018..2f6e9d1 100644 --- a/matrix/Cargo.toml +++ b/matrix/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +approx = "0.4" diff --git a/matrix/src/lib.rs b/matrix/src/lib.rs index 967c69e..378d3d1 100644 --- a/matrix/src/lib.rs +++ b/matrix/src/lib.rs @@ -1,5 +1,9 @@ +#[macro_use] +extern crate approx; + use std::ops::Index; +#[derive(Debug)] pub struct Matrix { matrix: Vec>, } @@ -19,12 +23,32 @@ impl Index for Matrix { } } +impl PartialEq for Matrix { + fn eq(&self, _rhs: &Self) -> bool { + if self.matrix.len() != _rhs.matrix.len() { + return false; + } + + for row_idx in 0..self.matrix.len() { + if self.matrix[row_idx].len() != _rhs.matrix[row_idx].len() { + return false; + } + for col_idx in 0..self.matrix[row_idx].len() { + if !relative_eq!(self.matrix[row_idx][col_idx], _rhs.matrix[row_idx][col_idx]) { + return false; + } + } + } + return true; + } +} + #[cfg(test)] mod tests { use super::*; #[test] - fn it_works() { + fn matrix_4x4() { let m = vec![ vec![1.0, 2.0, 3.0, 4.0], vec![5.5, 6.5, 7.5, 8.5], @@ -42,4 +66,74 @@ mod tests { assert_eq!(15.5, matrix[3][2]); } + #[test] + fn matrix_2x2() { + let m = vec![ + vec![-3.0, 5.0,], + vec![1.0, 2.0,], + ]; + let matrix = Matrix::new(m); + assert_eq!(-3.0, matrix[0][0]); + assert_eq!(5.0, matrix[0][1]); + assert_eq!(1.0, matrix[1][0]); + assert_eq!(2.0, matrix[1][1]); + } + + #[test] + fn matrix_3x3() { + let m = vec![ + vec![-3.0, 5.0, 0.0], + vec![1.0, -2.0, -7.0], + vec![0.0, 1.0, 1.0], + ]; + + let matrix = Matrix::new(m); + assert_eq!(-3.0, matrix[0][0]); + assert_eq!(-2.0, matrix[1][1]); + assert_eq!(1.0, matrix[2][2]); + } + + #[test] + fn matrix_equality_a() { + let a = vec![ + vec![1.0, 2.0, 3.0, 4.0], + vec![5.0, 6.0, 7.0, 8.0], + vec![9.0, 8.0, 7.0, 6.0], + vec![5.0, 4.0, 3.0, 2.0], + ]; + let m_a = Matrix::new(a); + + let b = vec![ + vec![1.0, 2.0, 3.0, 4.0], + vec![5.0, 6.0, 7.0, 8.0], + vec![9.0, 8.0, 7.0, 6.0], + vec![5.0, 4.0, 3.0, 2.0], + ]; + + let m_b = Matrix::new(b); + + assert_eq!(m_a, m_b); + } + + #[test] + fn matrix_equality_b() { + let a = vec![ + vec![1.0, 2.0, 3.0, 4.0], + vec![5.0, 6.0, 7.0, 8.0], + vec![9.0, 8.0, 7.0, 6.0], + vec![5.0, 4.0, 3.0, 2.0], + ]; + let m_a = Matrix::new(a); + + let b = vec![ + vec![2.0, 3.0, 4.0, 5.0], + vec![6.0, 7.0, 8.0, 9.0], + vec![8.0, 7.0, 6.0, 5.0], + vec![4.0, 3.0, 2.0, 1.0], + ]; + + let m_b = Matrix::new(b); + + assert_ne!(m_a, m_b); + } }