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
use crate::{
    dim::DimTrait,
    matrix::{MatrixBase, OwnedMatrix},
    num::Num,
};

pub trait Zeros: MatrixBase {
    fn zeros<I: Into<Self::Dim>>(dim: I) -> Self;
    fn zeros_like<M: MatrixBase>(m: M) -> Self;
}
impl<T, D, OM> Zeros for OM
where
    T: Num,
    D: DimTrait,
    OM: OwnedMatrix + MatrixBase<Dim = D, Item = T>,
{
    fn zeros<I: Into<Self::Dim>>(dim: I) -> Self {
        let dim = dim.into();
        let num_elm = dim.num_elm();
        let mut data = Vec::with_capacity(num_elm);
        for _ in 0..num_elm {
            data.push(T::zero());
        }
        <Self as OwnedMatrix>::from_vec(data, dim)
    }

    fn zeros_like<M: MatrixBase>(m: M) -> Self {
        Self::zeros(m.shape().slice())
    }
}

#[cfg(test)]
mod zeros {
    use crate::matrix_impl::OwnedMatrix0D;

    use super::Zeros;

    #[test]
    fn zeros_scalar() {
        let x: OwnedMatrix0D<f32> = Zeros::zeros([]);
        assert_eq!(x.get_value(), 0.0);
    }
}