array_matrix/matrix/
add.rs

1use std::ops::Add;
2
3use crate::Matrix;
4
5use super::matrix_init;
6
7pub trait MAdd<Rhs: Matrix>: Matrix
8where
9    Self::Output: Matrix
10{
11    type Output;
12
13    /// Adds two matrices of equal dimensions
14    /// 
15    /// A + B
16    /// 
17    /// # Arguments
18    /// 
19    /// * `rhs` - The addend matrix
20    /// 
21    /// # Examples
22    /// 
23    /// ```rust
24    /// let a = [
25    ///     [1.0, 2.0],
26    ///     [3.0, 4.0]
27    /// ];
28    /// let b = [
29    ///     [4.0, 3.0],
30    ///     [2.0, 1.0]
31    /// ];
32    /// let s = [
33    ///     [a[0][0] + b[0][0], a[0][1] + b[0][1]],
34    ///     [a[1][0] + b[1][0], a[1][1] + b[1][1]]
35    /// ];
36    /// assert_eq!(a.add(b), s);
37    /// ```
38    fn add(self, rhs: Rhs) -> Self::Output;
39}
40
41impl<T1, T2, const H: usize, const L: usize> MAdd<[[T2; L]; H]> for [[T1; L]; H]
42where
43    Self: Matrix,
44    [[T2; L]; H]: Matrix,
45    [[<T1 as Add<T2>>::Output; L]; H]: Matrix,
46    T1: Add<T2> + Clone,
47    T2: Clone
48{
49    type Output = [[<T1 as Add<T2>>::Output; L]; H];
50
51    fn add(self, rhs: [[T2; L]; H]) -> Self::Output
52    {
53        matrix_init(|r, c| self[r][c].clone() + rhs[r][c].clone())
54    }
55}