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