ndarray_numtest/
random_init.rs

1
2use ndarray::{Array, Dimension, ShapeBuilder};
3use ndarray_rand::RandomExt;
4use num_complex::Complex;
5use super::random;
6
7pub trait RealNormalInit<D: Dimension> {
8    fn real_normal_init<Sh>(shape: Sh, mean: f64, var: f64) -> Self where Sh: ShapeBuilder<Dim = D>;
9}
10
11pub trait ComplexNormalInit<D: Dimension> {
12    fn complex_normal_init<Sh>(shape: Sh, re0: f64, im0: f64, re_var: f64, im_var: f64) -> Self
13        where Sh: ShapeBuilder<Dim = D>;
14}
15
16macro_rules! impl_normal_init {
17    ($float:ty) => {
18impl<D> RealNormalInit<D> for Array<$float, D>
19    where D: Dimension
20{
21    fn real_normal_init<Sh>(shape: Sh, mean: f64, var: f64) -> Self
22        where Sh: ShapeBuilder<Dim = D>
23    {
24        let dist = random::RealNormal::new(mean, var);
25        Array::random(shape, dist)
26    }
27}
28
29impl<D> ComplexNormalInit<D> for Array<Complex<$float>, D>
30    where D: Dimension
31{
32    fn complex_normal_init<Sh>(shape: Sh, re0: f64, im0: f64, re_var: f64, im_var: f64) -> Self
33        where Sh: ShapeBuilder<Dim = D>
34    {
35        let dist = random::ComplexNormal::new(re0, im0, re_var, im_var);
36        Array::random(shape, dist)
37    }
38}
39}} // impl_normal_init
40
41impl_normal_init!(f32);
42impl_normal_init!(f64);