basic_dsp_matrix/general/
elementary.rs1use 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);