todo: finish matrix mul
This commit is contained in:
parent
79d94bf357
commit
0397811247
3 changed files with 46 additions and 5 deletions
|
@ -28,6 +28,14 @@ impl<T: Num + Clone> Matrix<T> {
|
||||||
pub fn new_zeroes(width: usize, height: usize) -> Self {
|
pub fn new_zeroes(width: usize, height: usize) -> Self {
|
||||||
Self::new_filled(T::zero(), width, height)
|
Self::new_filled(T::zero(), width, height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn row(&self, i: usize) -> Vec<T> {
|
||||||
|
self[i].to_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn column(&self, j: usize) -> Vec<T> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Num> Matrix<T> {
|
impl<T: Num> Matrix<T> {
|
||||||
|
@ -61,7 +69,11 @@ impl<T: Num> Matrix<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn same_size(&self, other: &Self) -> bool {
|
pub fn same_size(&self, other: &Self) -> bool {
|
||||||
return self.width == other.width && self.height() == other.height()
|
self.width == other.width && self.height() == other.height()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn can_mul(&self, other: &Self) -> bool {
|
||||||
|
self.width == other.height()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,21 @@ impl<T: NumAssign + Clone> DivAssign<T> for Matrix<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: Num + Clone> Mul for Matrix<T> {
|
||||||
|
type Output = Self;
|
||||||
|
fn mul(self, rhs: Self) -> Self::Output {
|
||||||
|
if !self.can_mul(&rhs) {
|
||||||
|
panic!("Unable to multiply matrices with sizes {}x{} and {}x{}",
|
||||||
|
self.width, self.height(), rhs.width, rhs.height());
|
||||||
|
}
|
||||||
|
let mut new = Matrix::new_zeroes(rhs.width, self.height());
|
||||||
|
for (i, j) in new.indices() {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -158,7 +173,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn mul() {
|
fn mul_num() {
|
||||||
let mut matrix = matrix![2; 1, 2, 3, 4];
|
let mut matrix = matrix![2; 1, 2, 3, 4];
|
||||||
matrix *= 2;
|
matrix *= 2;
|
||||||
assert_eq!(matrix, matrix![2; 2, 4, 6, 8]);
|
assert_eq!(matrix, matrix![2; 2, 4, 6, 8]);
|
||||||
|
@ -166,11 +181,17 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn div() {
|
fn div_num() {
|
||||||
let mut matrix = matrix![2; 2, 5, 8, 9];
|
let mut matrix = matrix![2; 2, 5, 8, 9];
|
||||||
matrix /= 2;
|
matrix /= 2;
|
||||||
assert_eq!(matrix, matrix![2; 1, 2, 4, 4]);
|
assert_eq!(matrix, matrix![2; 1, 2, 4, 4]);
|
||||||
assert_eq!(matrix / 4, matrix![2; 0, 0, 1, 1]);
|
assert_eq!(matrix / 4, matrix![2; 0, 0, 1, 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected = "Unable to multiply")]
|
||||||
|
fn mul() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,11 @@ impl<T: Num + Clone> Matrix<T> {
|
||||||
self.data.into_iter()
|
self.data.into_iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_iter_indexed(self) {
|
pub fn into_iter_indexed(self) -> () {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_iter_rows(self) {
|
pub fn into_iter_rows(self) -> () {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,14 @@ impl<T: Num + Clone> Matrix<T> {
|
||||||
self.data.chunks(self.width)
|
self.data.chunks(self.width)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn iter_column(&self) -> () {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn iter_columns(&self) -> () {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn iter_mut(&mut self) -> std::slice::IterMut<T> {
|
pub fn iter_mut(&mut self) -> std::slice::IterMut<T> {
|
||||||
self.data.iter_mut()
|
self.data.iter_mut()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue