From c14f13b14879aa413ab397b848ff51fe46bfa868 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Wed, 24 May 2023 23:39:46 -0500 Subject: [PATCH] new: Implement Sub trait --- src/lib.rs | 6 ++++-- src/matrix.rs | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5a1062c..8f441cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,11 +13,13 @@ mod tests { } #[test] - fn add_test() { + fn add_sub_test() { let a = Matrix::from(vec![vec![1, 2, 3], vec![0, 1, 2]]).unwrap(); let b = Matrix::from(vec![vec![0, 0, 1], vec![2, 1, 3]]).unwrap(); let c = Matrix::from(vec![vec![1, 2, 4], vec![2, 2, 5]]).unwrap(); - assert_eq!(a + b, c); + let d = Matrix::from(vec![vec![1, 2, 2], vec![-2, 0, -1]]).unwrap(); + assert_eq!(a.clone() + b.clone(), c); + assert_eq!(a - b, d); } #[test] diff --git a/src/matrix.rs b/src/matrix.rs index 0b8dc19..19ed212 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -5,7 +5,7 @@ use std::{ result::Result, }; -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Debug, Clone)] pub struct Matrix { entries: Vec>, } @@ -162,3 +162,20 @@ impl + Sub + Mul + Copy + Zero> Add for Matrix { } } } + +impl + Mul + Copy + Zero> Sub for Matrix { + type Output = Self; + fn sub(self, other: Self) -> Self { + if self.height() == other.height() && self.width() == other.width() { + let mut out = self.entries.clone(); + for (i, row) in self.rows().iter().enumerate() { + for (j, entry) in other.rows()[i].iter().enumerate() { + out[i][j] = row[j] - *entry; + } + } + Matrix { entries: out } + } else { + panic!("Both matrices must be of same dimensions."); + } + } +}