1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
use crate::algebra::{
abstr::{Field, Scalar},
linear::Matrix,
};
use std::ops::Sub;
impl<T> Sub for Matrix<T>
where T: Field + Scalar
{
type Output = Matrix<T>;
/// Subtracts two matrices
///
/// A = (a_{ij}) \in T^{m \times n}
/// B = (b_{ij}) \in T^{m \times n}
/// A - B = ( a_{ij} - b_{ij} )
///
/// # Arguments
///
/// rhs:
///
/// # Example
///
/// ```
/// use mathru::algebra::linear::Matrix;
///
/// let a: Matrix<f64> = Matrix::new(2, 2, vec![1.0, 0.0, 3.0, -7.0]);
/// let b: Matrix<f64> = Matrix::new(2, 2, vec![1.0, 0.0, 3.0, -7.0]);
///
/// let c: Matrix<f64> = a - b;
/// ```
fn sub(self, rhs: Self) -> Self::Output
{
(&self).sub(&rhs)
}
}
impl<'a, 'b, T> Sub<&'b Matrix<T>> for &'a Matrix<T>
where T: Field + Scalar
{
type Output = Matrix<T>;
fn sub(self, rhs: &'b Matrix<T>) -> Self::Output
{
assert_eq!(self.dim(), rhs.dim());
let (m, n) = rhs.dim();
Matrix { m,
n,
data: self.data
.iter()
.zip(rhs.data.iter())
.map(|(x, y)| *x - *y)
.collect::<Vec<T>>() }
}
}
impl<'a, 'b, T> Sub<&'b Matrix<T>> for &'a mut Matrix<T>
where T: Field + Scalar
{
type Output = &'a mut Matrix<T>;
fn sub(self, rhs: &'b Matrix<T>) -> Self::Output
{
assert_eq!(self.dim(), rhs.dim());
self.data.iter_mut().zip(rhs.data.iter()).for_each(|(x, y)| *x -= *y);
self
}
}
///
/// Subtracts scalar from all matrix elements
impl<'a, 'b, T> Sub<&'b T> for &'a Matrix<T>
where T: Field + Scalar
{
type Output = Matrix<T>;
/// Subtracts a scalar value from all matrix elements
///
/// # Example
///
/// ```
/// use mathru::algebra::linear::Matrix;
///
/// let a: Matrix<f64> = Matrix::new(2, 2, vec![1.0, 0.0, 3.0, -7.0]);
/// let b: Matrix<f64> = &a - &-4.0;
/// ```
fn sub(self, rhs: &T) -> Self::Output
{
self.apply(&|x: &T| -> T { *x - *rhs })
}
}
///
/// Subtracts scalar from all matrix elements
impl<'a, 'b, T> Sub<&'b T> for &'a mut Matrix<T>
where T: Field + Scalar
{
type Output = &'a mut Matrix<T>;
/// Subtracts a scalar value from all matrix elements
///
/// # Example
///
/// ```
/// use mathru::algebra::linear::Matrix;
///
/// let a: Matrix<f64> = Matrix::new(2, 2, vec![1.0, 0.0, 3.0, -7.0]);
/// let b: Matrix<f64> = &a - &-4.0;
/// ```
fn sub(self, rhs: &T) -> Self::Output
{
let _ = self.data.iter_mut().for_each(&|x: &mut T| *x -= *rhs);
self
}
}
impl<T> Sub<T> for Matrix<T>
where T: Field + Scalar
{
type Output = Matrix<T>;
/// Subtracts a scalar from all matrix elements
///
/// # Example
///
/// ```
/// use mathru::algebra::linear::Matrix;
///
/// let a: Matrix<f64> = Matrix::new(2, 2, vec![1.0, 0.0, 3.0, -7.0]);
/// let b: Matrix<f64> = a - -4.0;
/// ```
fn sub(self, rhs: T) -> Self::Output
{
(&self).sub(&rhs)
}
}