numas/factory/
numeric.rs

1use array::Array;
2
3/// Returns evenly spaced elements from given interval
4///
5/// # Arguments
6///
7/// * `start` - start of interval
8/// * `stop` - end of interval
9/// * `num` - number of elements
10///
11/// # Examples
12///
13/// ```
14///  use numas::array::Array;
15///
16///  let array = numas::factory::numeric::linspace(1.0, 5.0, 9);
17///  let data = array.collect();
18///
19///  assert_eq!(data, vec![1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]);
20/// ```
21pub fn linspace(start: f64, stop: f64, num: usize) -> Array<f64> {
22    let mut data: Vec<f64> = Vec::with_capacity(num);
23
24    let step: f64 = (stop - start) / (num - 1) as f64;
25    let mut tmp = start;
26
27    for _ in 0..num {
28        data.push(tmp);
29        tmp += step;
30    }
31
32    return Array::new(data, vec![num as i32]);
33}
34
35/// Returns evenly spaced interval within a given interval
36///
37/// # Arguments
38///
39/// * `start` - start of interval
40/// * `stop` - end of interval
41/// * `step` - step of interval
42///
43/// # Examples
44///
45/// ```
46///  use numas::array::Array;
47///
48///  let array = numas::factory::numeric::arange(1.0, 5.0, 1.5);
49///  let data = array.collect();
50///
51///  assert_eq!(data, vec![1.0, 2.5, 4.0]);
52/// ```
53pub fn arange(start: f64, stop: f64, step: f64) -> Array<f64> {
54    let num = f64::ceil((stop - start) / step) as i32;
55    let mut data: Vec<f64> = Vec::with_capacity(num as usize);
56    let mut tmp = start;
57
58    for _ in 0..num {
59        data.push(tmp);
60        tmp = tmp + step;
61    }
62
63    return Array::new(data, vec![num]);
64}
65
66/// Returns evenly spaced elements on log space from given interval
67///
68/// # Arguments
69///
70/// * `start` - start of interval
71/// * `stop` - end of interval
72/// * `base` - base of log
73/// * `num` - number of elements
74pub fn logspace(start: f64, stop: f64, base: f64, num: usize) -> Array<f64> {
75    let mut data: Vec<f64> = Vec::with_capacity(num);
76
77    let step: f64 = (stop - start) / (num - 1) as f64;
78    let mut tmp = start;
79
80    for _ in 0..num {
81        data.push(base.powf(tmp));
82        tmp += step;
83    }
84
85    return Array::new(data, vec![num as i32]);
86}
87
88