|
7 | 7 | clippy::float_cmp
|
8 | 8 | )]
|
9 | 9 |
|
| 10 | +use approx::assert_relative_eq; |
10 | 11 | use defmac::defmac;
|
11 | 12 | use itertools::{zip, Itertools};
|
12 | 13 | use ndarray::prelude::*;
|
13 | 14 | use ndarray::{arr3, rcarr2};
|
14 | 15 | use ndarray::indices;
|
15 | 16 | use ndarray::{Slice, SliceInfo, SliceInfoElem};
|
| 17 | +use num_complex::Complex; |
16 | 18 | use std::convert::TryFrom;
|
17 | 19 |
|
18 | 20 | macro_rules! assert_panics {
|
@@ -2501,3 +2503,71 @@ fn test_remove_index_oob3() {
|
2501 | 2503 | let mut a = array![[10], [4], [1]];
|
2502 | 2504 | a.remove_index(Axis(2), 0);
|
2503 | 2505 | }
|
| 2506 | + |
| 2507 | +#[test] |
| 2508 | +fn test_split_re_im_view() { |
| 2509 | + let a = Array3::from_shape_fn((3, 4, 5), |(i, j, k)| { |
| 2510 | + Complex::<f32>::new(i as f32 * j as f32, k as f32) |
| 2511 | + }); |
| 2512 | + let Complex { re, im } = a.view().split_re_im(); |
| 2513 | + assert_relative_eq!(re.sum(), 90.); |
| 2514 | + assert_relative_eq!(im.sum(), 120.); |
| 2515 | +} |
| 2516 | + |
| 2517 | +#[test] |
| 2518 | +fn test_split_re_im_view_roundtrip() { |
| 2519 | + let a_re = Array3::from_shape_fn((3,1,5), |(i, j, _k)| { |
| 2520 | + i * j |
| 2521 | + }); |
| 2522 | + let a_im = Array3::from_shape_fn((3,1,5), |(_i, _j, k)| { |
| 2523 | + k |
| 2524 | + }); |
| 2525 | + let a = Array3::from_shape_fn((3,1,5), |(i,j,k)| { |
| 2526 | + Complex::new(a_re[[i,j,k]], a_im[[i,j,k]]) |
| 2527 | + }); |
| 2528 | + let Complex { re, im } = a.view().split_re_im(); |
| 2529 | + assert_eq!(a_re, re); |
| 2530 | + assert_eq!(a_im, im); |
| 2531 | +} |
| 2532 | + |
| 2533 | +#[test] |
| 2534 | +fn test_split_re_im_view_mut() { |
| 2535 | + let eye_scalar = Array2::<u32>::eye(4); |
| 2536 | + let eye_complex = Array2::<Complex<u32>>::eye(4); |
| 2537 | + let mut a = Array2::<Complex<u32>>::zeros((4, 4)); |
| 2538 | + let Complex { mut re, im } = a.view_mut().split_re_im(); |
| 2539 | + re.assign(&eye_scalar); |
| 2540 | + assert_eq!(im.sum(), 0); |
| 2541 | + assert_eq!(a, eye_complex); |
| 2542 | +} |
| 2543 | + |
| 2544 | +#[test] |
| 2545 | +fn test_split_re_im_zerod() { |
| 2546 | + let mut a = Array0::from_elem((), Complex::new(42, 32)); |
| 2547 | + let Complex { re, im } = a.view().split_re_im(); |
| 2548 | + assert_eq!(re.get(()), Some(&42)); |
| 2549 | + assert_eq!(im.get(()), Some(&32)); |
| 2550 | + let cmplx = a.view_mut().split_re_im(); |
| 2551 | + cmplx.re.assign_to(cmplx.im); |
| 2552 | + assert_eq!(a.get(()).unwrap().im, 42); |
| 2553 | +} |
| 2554 | + |
| 2555 | +#[test] |
| 2556 | +fn test_split_re_im_permuted() { |
| 2557 | + let a = Array3::from_shape_fn((3, 4, 5), |(i, j, k)| { |
| 2558 | + Complex::new(i * k + j, k) |
| 2559 | + }); |
| 2560 | + let permuted = a.view().permuted_axes([1,0,2]); |
| 2561 | + let Complex { re, im } = permuted.split_re_im(); |
| 2562 | + assert_eq!(re.get((3,2,4)).unwrap(), &11); |
| 2563 | + assert_eq!(im.get((3,2,4)).unwrap(), &4); |
| 2564 | +} |
| 2565 | + |
| 2566 | +#[test] |
| 2567 | +fn test_split_re_im_invert_axis() { |
| 2568 | + let mut a = Array::from_shape_fn((2, 3, 2), |(i, j, k)| Complex::new(i as f64 + j as f64, i as f64 + k as f64)); |
| 2569 | + a.invert_axis(Axis(1)); |
| 2570 | + let cmplx = a.view().split_re_im(); |
| 2571 | + assert_eq!(cmplx.re, a.mapv(|z| z.re)); |
| 2572 | + assert_eq!(cmplx.im, a.mapv(|z| z.im)); |
| 2573 | +} |
0 commit comments