peroxide/macros/matlab_macro.rs
1/// MATLAB like zeros - zero matrix
2///
3/// # Examples
4/// ```
5/// #[macro_use]
6/// extern crate peroxide;
7/// use peroxide::fuga::*;
8///
9/// fn main() {
10/// let a = zeros!(4);
11/// assert_eq!(a, c!(0,0,0,0));
12///
13/// let b = zeros!(3, 2);
14/// assert_eq!(b, matrix(c!(0,0,0,0,0,0), 3, 2, Row));
15/// }
16/// ```
17#[macro_export]
18macro_rules! zeros {
19 ( $n:expr ) => {
20 vec![0f64; $n]
21 };
22
23 ( $r:expr, $c:expr ) => {{
24 let (r, c) = ($r, $c);
25 matrix(vec![0f64; r * c], r, c, Row)
26 }};
27}
28
29/// MATLAB like rand - random matrix
30///
31/// # Examples
32/// ```
33/// #[macro_use]
34/// extern crate peroxide;
35/// use peroxide::fuga::*;
36///
37/// fn main() {
38/// let a = rand!(2, 2);
39/// println!("{}", a); // 2 x 2 random matrix (0 ~ 1)
40/// }
41/// ```
42#[macro_export]
43macro_rules! rand {
44 () => {{
45 let mut rng = rand::rng();
46 rng.random_range(0f64..=1f64)
47 }};
48
49 ( $m:expr, $n:expr ) => {{
50 let r = $m;
51 let c = $n;
52 let mut rng = rand::rng();
53 let mut m = matrix(vec![0f64; r * c], r, c, Row);
54 for i in 0..r {
55 for j in 0..c {
56 m[(i, j)] = rng.random_range(0f64..=1f64);
57 }
58 }
59 m
60 }};
61}
62
63/// MATLAB like eye - identity matrix
64///
65/// # Examples
66///
67/// ```
68/// #[macro_use]
69/// extern crate peroxide;
70/// use peroxide::fuga::*;
71///
72/// fn main() {
73/// let i = eye!(2);
74/// assert_eq!(i, matrix(c!(1,0,0,1), 2, 2, Row));
75/// }
76/// ```
77#[macro_export]
78macro_rules! eye {
79 ( $n:expr ) => {{
80 let n = $n;
81 let mut m = matrix(vec![0f64; n * n], n, n, Row);
82 for i in 0..n {
83 m[(i, i)] = 1f64;
84 }
85 m
86 }};
87}
88
89/// MATLAB like linspace
90///
91/// # Examples
92/// ```
93/// #[macro_use]
94/// extern crate peroxide;
95/// use peroxide::fuga::*;
96///
97/// fn main() {
98/// let a = linspace!(1, 10, 10);
99/// assert_eq!(a, seq!(1,10,1));
100/// }
101/// ```
102/// ```
103/// #[macro_use]
104/// extern crate peroxide;
105/// use peroxide::fuga::*;
106///
107/// fn main() {
108/// let a = linspace!(10, 1000);
109/// assert_eq!(a, seq!(10,1000,10));
110/// }
111/// ```
112#[macro_export]
113macro_rules! linspace {
114 ( $start:expr, $end:expr, $length: expr) => {{
115 let step = ($end - $start) as f64 / ($length as f64 - 1f64);
116 seq!($start, $end, step)
117 }};
118
119 ( $start:expr, $end:expr ) => {{
120 let step = ($end - $start) as f64 / (99f64);
121 seq!($start, $end, step)
122 }};
123}