basic_dsp_matrix/general/
elementary.rs

1use super::*;
2
3macro_rules! add_mat_impl {
4    ($($matrix:ident);*) => {
5        $(
6            impl<V: Vector<T> + ScaleOps<T>, S: ToSlice<T>, T: RealNumber>
7					ScaleOps<T> for $matrix<V, S, T> {
8				fn scale(&mut self, factor: T) {
9					for v in self.rows_mut() {
10						v.scale(factor);
11					}
12				}
13			}
14
15			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber> OffsetOps<T>
16                    for $matrix<V, S, T>
17                    where V: OffsetOps<T> {
18				fn offset(&mut self, offset: T) {
19					for v in self.rows_mut() {
20						v.offset(offset);
21					}
22				}
23			}
24
25			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber> ScaleOps<Complex<T>>
26                    for $matrix<V, S, T>
27                    where V: ScaleOps<Complex<T>> {
28				fn scale(&mut self, factor: Complex<T>) {
29					for v in self.rows_mut() {
30						v.scale(factor);
31					}
32				}
33			}
34
35			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber> OffsetOps<Complex<T>>
36                    for $matrix<V, S, T>
37                    where V: OffsetOps<Complex<T>> {
38				fn offset(&mut self, offset: Complex<T>) {
39					for v in self.rows_mut() {
40						v.offset(offset);
41					}
42				}
43			}
44
45			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber, N: NumberSpace, D: Domain> ElementaryOps<$matrix<V, S, T>, T, N, D>
46                    for $matrix<V, S, T>
47                    where V: ElementaryOps<V, T, N, D> + GetMetaData<T, N, D> {
48				fn add(&mut self, summand: &Self) -> VoidResult {
49					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
50						v.add(o)?;
51					}
52
53					Ok(())
54				}
55
56				fn sub(&mut self, summand: &Self) -> VoidResult {
57					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
58						v.sub(o)?;
59					}
60
61					Ok(())
62				}
63
64				fn div(&mut self, summand: &Self) -> VoidResult {
65					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
66						v.div(o)?;
67					}
68
69					Ok(())
70				}
71
72				fn mul(&mut self, summand: &Self) -> VoidResult {
73					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
74						v.mul(o)?;
75					}
76
77					Ok(())
78				}
79			}
80
81			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber, N: NumberSpace, D: Domain> ElementaryOps<V, T, N, D>
82                    for $matrix<V, S, T>
83                    where V: ElementaryOps<V, T, N, D> + GetMetaData<T, N, D> {
84				fn add(&mut self, summand: &V) -> VoidResult {
85                    for v in self.rows_mut() {
86						v.add(summand)?;
87					}
88
89					Ok(())
90				}
91
92				fn sub(&mut self, summand: &V) -> VoidResult {
93                    for v in self.rows_mut() {
94						v.sub(summand)?;
95					}
96
97					Ok(())
98				}
99
100				fn div(&mut self, summand: &V) -> VoidResult {
101                    for v in self.rows_mut() {
102						v.div(summand)?;
103					}
104
105					Ok(())
106				}
107
108				fn mul(&mut self, summand: &V) -> VoidResult {
109                    for v in self.rows_mut() {
110						v.mul(summand)?;
111					}
112
113					Ok(())
114				}
115			}
116
117			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber, N: NumberSpace, D: Domain>
118                    ElementaryWrapAroundOps<$matrix<V, S, T>, T, N, D>
119                    for $matrix<V, S, T>
120                    where V: ElementaryWrapAroundOps<V, T, N, D> + GetMetaData<T, N, D> {
121				fn add_smaller(&mut self, summand: &Self) -> VoidResult {
122					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
123						v.add_smaller(o)?;
124					}
125
126					Ok(())
127				}
128
129				fn sub_smaller(&mut self, summand: &Self) -> VoidResult {
130					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
131						v.sub_smaller(o)?;
132					}
133
134					Ok(())
135				}
136
137				fn div_smaller(&mut self, summand: &Self) -> VoidResult {
138					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
139						v.div_smaller(o)?;
140					}
141
142					Ok(())
143				}
144
145				fn mul_smaller(&mut self, summand: &Self) -> VoidResult {
146					for (v, o) in self.rows_mut().iter_mut().zip(summand.rows()) {
147						v.mul_smaller(o)?;
148					}
149
150					Ok(())
151				}
152			}
153
154			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber, N: NumberSpace, D: Domain> ElementaryWrapAroundOps<V, T, N, D>
155                    for $matrix<V, S, T>
156                    where V: ElementaryWrapAroundOps<V, T, N, D> + GetMetaData<T, N, D> {
157				fn add_smaller(&mut self, summand: &V) -> VoidResult {
158                    for v in self.rows_mut() {
159						v.add_smaller(summand)?;
160					}
161
162					Ok(())
163				}
164
165				fn sub_smaller(&mut self, summand: &V) -> VoidResult {
166                    for v in self.rows_mut() {
167						v.sub_smaller(summand)?;
168					}
169
170					Ok(())
171				}
172
173				fn div_smaller(&mut self, summand: &V) -> VoidResult {
174                    for v in self.rows_mut() {
175						v.div_smaller(summand)?;
176					}
177
178					Ok(())
179				}
180
181				fn mul_smaller(&mut self, summand: &V) -> VoidResult {
182                    for v in self.rows_mut() {
183						v.mul_smaller(summand)?;
184					}
185
186					Ok(())
187				}
188			}
189
190			impl<V: Vector<T>, S: ToSlice<T>, T: RealNumber> ReorganizeDataOps<T>
191                    for $matrix<V, S, T>
192                    where V: ReorganizeDataOps<T> {
193				fn reverse(&mut self)  {
194					for v in self.rows_mut() {
195						v.reverse()
196					}
197				}
198
199				fn swap_halves(&mut self)  {
200					for v in self.rows_mut() {
201						v.swap_halves()
202					}
203				}
204			}
205
206			impl<S: ToSlice<T>, V: Vector<T> + DiffSumOps, T: RealNumber>
207					DiffSumOps for $matrix<V, S, T> {
208				fn diff(&mut self)  {
209					for v in self.rows_mut() {
210						v.diff()
211					}
212				}
213
214				fn diff_with_start(&mut self)  {
215					for v in self.rows_mut() {
216						v.diff()
217					}
218				}
219
220				fn cum_sum(&mut self)  {
221					for v in self.rows_mut() {
222						v.diff()
223					}
224				}
225			}
226
227			impl<S: ToSlice<T>, V: Vector<T> + TrigOps, T: RealNumber>
228					TrigOps for $matrix<V, S, T> {
229				fn sin(&mut self)  {
230					for v in self.rows_mut() {
231						v.sin()
232					}
233				}
234
235				fn cos(&mut self)  {
236					for v in self.rows_mut() {
237						v.cos()
238					}
239				}
240
241				fn tan(&mut self)  {
242					for v in self.rows_mut() {
243						v.tan()
244					}
245				}
246
247				fn asin(&mut self)  {
248					for v in self.rows_mut() {
249						v.asin()
250					}
251				}
252
253				fn acos(&mut self)  {
254					for v in self.rows_mut() {
255						v.acos()
256					}
257				}
258
259				fn atan(&mut self)  {
260					for v in self.rows_mut() {
261						v.atan()
262					}
263				}
264
265				fn sinh(&mut self)  {
266					for v in self.rows_mut() {
267						v.sinh()
268					}
269				}
270
271				fn cosh(&mut self)  {
272					for v in self.rows_mut() {
273						v.cosh()
274					}
275				}
276
277				fn tanh(&mut self)  {
278					for v in self.rows_mut() {
279						v.tanh()
280					}
281				}
282
283				fn asinh(&mut self)  {
284					for v in self.rows_mut() {
285						v.asinh()
286					}
287				}
288
289				fn acosh(&mut self)  {
290					for v in self.rows_mut() {
291						v.acosh()
292					}
293				}
294
295				fn atanh(&mut self)  {
296					for v in self.rows_mut() {
297						v.atanh()
298					}
299				}
300			}
301
302			impl<S: ToSlice<T>, V: Vector<T> + PowerOps<T>, T: RealNumber>
303					PowerOps<T> for $matrix<V, S, T> {
304				fn sqrt(&mut self)  {
305					for v in self.rows_mut() {
306						v.sqrt()
307					}
308				}
309
310				fn square(&mut self)  {
311					for v in self.rows_mut() {
312						v.square()
313					}
314				}
315
316				fn root(&mut self, degree: T)  {
317					for v in self.rows_mut() {
318						v.root(degree)
319					}
320				}
321
322				fn powf(&mut self, exponent: T)  {
323					for v in self.rows_mut() {
324						v.powf(exponent)
325					}
326				}
327
328				fn ln(&mut self)  {
329					for v in self.rows_mut() {
330						v.ln()
331					}
332				}
333
334				fn exp(&mut self)  {
335					for v in self.rows_mut() {
336						v.exp()
337					}
338				}
339
340				fn log(&mut self, base: T)  {
341					for v in self.rows_mut() {
342						v.log(base)
343					}
344				}
345
346				fn expf(&mut self, base: T)  {
347					for v in self.rows_mut() {
348						v.expf(base)
349					}
350				}
351			}
352
353			impl<S: ToSlice<T>, V: Vector<T> + MapInplaceOps<T>, T: RealNumber>
354					MapInplaceOps<T> for $matrix<V, S, T> {
355				fn map_inplace<'a, A, F>(&mut self, argument: A, map: &F)
356					where A: Sync + Copy + Send,
357					  	  F: Fn(T, usize, A) -> T + 'a + Sync {
358					for v in self.rows_mut() {
359						v.map_inplace(argument, &map)
360					}
361				}
362			}
363
364			impl<S: ToSlice<T>, V: Vector<T> + MapInplaceOps<Complex<T>>, T: RealNumber>
365					MapInplaceOps<Complex<T>> for $matrix<V, S, T> {
366				fn map_inplace<'a, A, F>(&mut self, argument: A, map: &F)
367					where A: Sync + Copy + Send,
368					  	  F: Fn(Complex<T>, usize, A) -> Complex<T> + 'a + Sync {
369					for v in self.rows_mut() {
370						v.map_inplace(argument, &map)
371					}
372				}
373			}
374		)*
375	}
376}
377
378add_mat_impl!(MatrixMxN; Matrix2xN; Matrix3xN; Matrix4xN);