summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongheng Liu <z.liu@outlook.com.gr>2025-01-23 19:06:49 +0200
committerZhongheng Liu <z.liu@outlook.com.gr>2025-01-23 19:06:49 +0200
commit333c6c7281925c42a4a06fa245fe377b9bea88e4 (patch)
tree653da00a7d2e0984b038385b0b7a7612c9534e18
parent0412ac54d5654273a3412590e22c3ea4ebacfded (diff)
downloadmatrix-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.rs11
-rw-r--r--src/matrix.rs (renamed from src/types/matrix.rs)35
-rw-r--r--src/tests.rs3
-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.rs22
-rw-r--r--src/types.rs8
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
diff --git a/src/lib.rs b/src/lib.rs
index 1a39221..748ca1b 100644
--- a/src/lib.rs
+++ b/src/lib.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;