diff options
author | Zhongheng Liu <z.liu@outlook.com.gr> | 2025-01-23 19:06:49 +0200 |
---|---|---|
committer | Zhongheng Liu <z.liu@outlook.com.gr> | 2025-01-23 19:06:49 +0200 |
commit | 333c6c7281925c42a4a06fa245fe377b9bea88e4 (patch) | |
tree | 653da00a7d2e0984b038385b0b7a7612c9534e18 | |
parent | 0412ac54d5654273a3412590e22c3ea4ebacfded (diff) | |
download | matrix-rs-333c6c7281925c42a4a06fa245fe377b9bea88e4.tar.gz matrix-rs-333c6c7281925c42a4a06fa245fe377b9bea88e4.tar.bz2 matrix-rs-333c6c7281925c42a4a06fa245fe377b9bea88e4.zip |
feat(matrix_op): add multiplication
matrix_ops: add matrix multiply capability
chore(fmt): flatten crate directory
tests(ops): add tests for multiplication
-rw-r--r-- | src/error.rs (renamed from src/types/matrix_err.rs) | 0 | ||||
-rw-r--r-- | src/lib.rs | 11 | ||||
-rw-r--r-- | src/matrix.rs (renamed from src/types/matrix.rs) | 35 | ||||
-rw-r--r-- | src/tests.rs | 3 | ||||
-rw-r--r-- | src/tests/matrix_test_ops.rs (renamed from src/tests/matrix_test.rs) | 31 | ||||
-rw-r--r-- | src/tests/matrix_test_parse.rs | 22 | ||||
-rw-r--r-- | src/types.rs | 8 |
7 files changed, 70 insertions, 40 deletions
diff --git a/src/types/matrix_err.rs b/src/error.rs index f5309e1..f5309e1 100644 --- a/src/types/matrix_err.rs +++ b/src/error.rs @@ -9,20 +9,23 @@ //! //! Examples: //! ``` -//! ... //! use matrix::Matrix; -//! let m = Matrix::from_str("1,2,3\n4,5,6\n7,8,9"); +//! use std::str::FromStr; +//! let m = Matrix::from_str("1,2,3\n4,5,6\n7,8,9").expect("Expected this to work"); //! println!("Matrix string formatting:\n{}", m); //! println!("Evaluate determinant of matrix: {}", m.determinant()); //! println!("Transpose of matrix m:\n{}", m.transpose()); -//! ... +//! //! ``` -pub mod types; +mod matrix; +pub mod error; #[cfg(test)] mod tests; +pub use matrix::Matrix; + pub fn test() { println!("Testing code here"); } diff --git a/src/types/matrix.rs b/src/matrix.rs index 40ecedf..ec347c9 100644 --- a/src/types/matrix.rs +++ b/src/matrix.rs @@ -3,16 +3,17 @@ //! Example usage - addition of two matrices: //! ``` //! use matrix::Matrix; -//! let m1 = Matrix::from_str("1,1,1\n1,1,1\n1,1,1"); -//! let m2 = Matrix::from_str("2,2,2\n2,2,2\n2,2,2"); -//! println!("Sum of m1 + m2: \n{}", m1 + m2); +//! use std::str::FromStr; +//! let m1 = Matrix::from_str("1,2\n3,4").expect("Expect parse correct"); +//! let m2 = Matrix::from_str("1,1\n1,1").expect("Expect parse correct"); +//! let m_add = &m1 + &m2; +//! println!("m1 + m2 =\n{}", m_add); //! ``` -//! //! TODO:: Create matrix multiplication method use std::{fmt::Display, ops::{Add, Mul, Sub}, str::FromStr}; -use super::matrix_err::{MatrixSetValueError, ParseMatrixError}; +use crate::error::{MatrixSetValueError, ParseMatrixError}; #[derive(Debug, PartialEq, Eq)] pub struct Matrix { /// Number of rows in matrix. @@ -91,11 +92,31 @@ impl<'a, 'b> Sub<&'b Matrix> for &'a Matrix { fn sub(self, rhs: &'b Matrix) -> Self::Output { todo!() } -} + } impl<'a, 'b> Mul<&'b Matrix> for &'a Matrix { type Output = Matrix; fn mul(self, rhs: &'b Matrix) -> Self::Output { - todo!() + fn reduce(lhs: &Matrix, rhs: &Matrix, at_r: usize, at_c: usize) -> i32 { + let mut tmp = 0; + for i in 0..lhs.ncols { + tmp += lhs.get(at_r, i).unwrap() * rhs.get(i, at_c).unwrap(); + } + tmp + } + let mut d: Vec<Vec<i32>> = Vec::new(); + if self.ncols != rhs.nrows { + println!("LHS: \n{}RHS: \n{}", self, rhs); + println!("LHS nrows: {} ;; RHS ncols: {}", self.nrows, rhs.ncols); + panic!() + } + for i in 0..self.nrows { + let mut r: Vec<i32> = Vec::new(); + for j in 0..rhs.ncols { + r.push(reduce(self, rhs, i, j)); + } + d.push(r); + } + Matrix::new(d) } } diff --git a/src/tests.rs b/src/tests.rs index a921a25..5149c6b 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,2 +1,3 @@ #[cfg(test)] -pub mod matrix_test; +mod matrix_test_parse; +mod matrix_test_ops; diff --git a/src/tests/matrix_test.rs b/src/tests/matrix_test_ops.rs index 08ed3a6..fe8c40d 100644 --- a/src/tests/matrix_test.rs +++ b/src/tests/matrix_test_ops.rs @@ -1,20 +1,8 @@ use std::str::FromStr; -use crate::types::{matrix::Matrix, matrix_err::ParseMatrixError}; +use crate::{matrix::Matrix, error::ParseMatrixError}; #[test] -pub fn test_matrix_init_from_string() -> Result<(), ParseMatrixError> { - let data_target = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; - let target = Matrix { - nrows: 3, - ncols: 3, - data: data_target, - }; - let test = Matrix::from_str("1,2,3\n4,5,6\n7,8,9")?; - assert_eq!(target, test); - Ok(()) -} -#[test] pub fn test_matrix_add() -> Result<(), ParseMatrixError> { let m1 = Matrix::from_str("1,2,3\n4,5,6\n7,8,9")?; let m2 = Matrix::from_str("1,1,1\n1,1,1\n1,1,1")?; @@ -37,13 +25,16 @@ pub fn test_matrix_transposition() -> Result<(), ParseMatrixError> { Ok(()) } #[test] -pub fn test_matrix_parse_malformed() -> () { - let malformed = "1,23,\n,567,\n\n5"; - let m = Matrix::from_str(malformed); - match m { - Ok(_) => panic!("This malformed matrix string should not have succeeded"), - Err(_) => (), - } +pub fn test_matrix_mul() -> Result<(), ParseMatrixError> { + let m1 = Matrix::from_str("1,2\n1,2")?; + let m2 = Matrix::from_str("1,3\n2,4")?; + let m3 = Matrix::from_str("1,2\n3,4")?; + let m4 = Matrix::from_str("1\n2")?; + let t1 = Matrix::from_str("5,11\n5,11")?; + let t2 = Matrix::from_str("5\n11")?; + assert_eq!(&m1 * &m2, t1); + assert_eq!(&m3 * &m4, t2); + Ok(()) } #[test] #[should_panic] diff --git a/src/tests/matrix_test_parse.rs b/src/tests/matrix_test_parse.rs new file mode 100644 index 0000000..a31851a --- /dev/null +++ b/src/tests/matrix_test_parse.rs @@ -0,0 +1,22 @@ +use std::str::FromStr; + +use crate::{matrix::Matrix, error::ParseMatrixError}; + +#[test] +pub fn test_matrix_init_from_string() -> Result<(), ParseMatrixError> { + let data_target = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; + let target = Matrix::new(data_target); + let test = Matrix::from_str("1,2,3\n4,5,6\n7,8,9")?; + assert_eq!(target, test); + Ok(()) +} +#[test] +pub fn test_matrix_parse_malformed() -> () { + let malformed = "1,23,\n,567,\n\n5"; + let m = Matrix::from_str(malformed); + match m { + Ok(_) => panic!("This malformed matrix string should not have succeeded"), + Err(_) => (), + } +} + diff --git a/src/types.rs b/src/types.rs deleted file mode 100644 index d7494e1..0000000 --- a/src/types.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Matrix-related type definitions -//! -//! Includes modules: -//! - Matrix -//! - Matrix parse and arithmetic errors - -pub mod matrix; -pub mod matrix_err; |