Trait slice_math::SliceMath
source · pub trait SliceMath<T>: SliceOps<T> {
Show 41 methods
// Required methods
fn recip_assign_all(&mut self)
where T: Inv<Output = T>;
fn conj_assign_all(&mut self)
where T: ComplexFloat;
fn convolve_direct<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: Mul<Rhs, Output: AddAssign + Zero> + Copy,
Rhs: Copy,
C: FromIterator<<T as Mul<Rhs>>::Output>;
fn convolve_real_fft<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: Float + Copy,
Rhs: Float + Copy,
Complex<T>: MulAssign + AddAssign + ComplexFloat<Real = T> + Mul<Complex<Rhs>, Output: ComplexFloat<Real: Float>>,
Complex<Rhs>: MulAssign + AddAssign + ComplexFloat<Real = Rhs>,
<Complex<T> as Mul<Complex<Rhs>>>::Output: ComplexFloat<Real: Float> + Into<Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>>,
Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>: MulAssign + AddAssign + MulAssign<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real> + ComplexFloat<Real = <<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
C: FromIterator<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>;
fn convolve_fft<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: ComplexFloat + Mul<Rhs, Output: ComplexFloat<Real: Into<<T as Mul<Rhs>>::Output>> + 'static> + Into<Complex<T::Real>>,
Rhs: ComplexFloat + Into<Complex<Rhs::Real>>,
Complex<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real>: Into<<Complex<T::Real> as Mul<Complex<Rhs::Real>>>::Output>,
Complex<T::Real>: AddAssign + MulAssign + Mul<Complex<Rhs::Real>, Output: ComplexFloat<Real = <<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + MulAssign + AddAssign + MulAssign<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + Sum + 'static>,
Complex<Rhs::Real>: AddAssign + MulAssign,
C: FromIterator<<T as Mul<Rhs>>::Output>;
fn cconvolve_direct<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: Mul<Rhs, Output: AddAssign + Zero> + Copy,
Rhs: Copy,
C: FromIterator<<T as Mul<Rhs>>::Output>;
fn cconvolve_real_fft<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: Float + Copy,
Rhs: Float + Copy,
Complex<T>: MulAssign + AddAssign + ComplexFloat<Real = T> + Mul<Complex<Rhs>, Output: ComplexFloat<Real: Float>>,
Complex<Rhs>: MulAssign + AddAssign + ComplexFloat<Real = Rhs>,
<Complex<T> as Mul<Complex<Rhs>>>::Output: ComplexFloat<Real: Float> + Into<Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>>,
Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>: MulAssign + AddAssign + MulAssign<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real> + ComplexFloat<Real = <<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
C: FromIterator<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>;
fn cconvolve_fft<Rhs, C>(&self, rhs: &[Rhs]) -> C
where T: ComplexFloat + Mul<Rhs, Output: ComplexFloat<Real: Into<<T as Mul<Rhs>>::Output>> + 'static> + Into<Complex<T::Real>>,
Rhs: ComplexFloat + Into<Complex<Rhs::Real>>,
Complex<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real>: Into<<Complex<T::Real> as Mul<Complex<Rhs::Real>>>::Output>,
Complex<T::Real>: AddAssign + MulAssign + Mul<Complex<Rhs::Real>, Output: ComplexFloat<Real = <<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + MulAssign + AddAssign + MulAssign<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + Sum + 'static>,
Complex<Rhs::Real>: AddAssign + MulAssign,
C: FromIterator<<T as Mul<Rhs>>::Output>;
fn dtft(&self, omega: T::Real) -> Complex<T::Real>
where T: ComplexFloat + Into<Complex<T::Real>>,
Complex<T::Real>: ComplexFloat<Real = T::Real> + MulAssign + AddAssign;
fn fft_unscaled<const I: bool>(&mut self)
where T: ComplexFloat<Real: Float> + MulAssign + AddAssign + Sum,
Complex<T::Real>: Into<T>;
fn fft(&mut self)
where T: ComplexFloat<Real: Float> + MulAssign + AddAssign + Sum,
Complex<T::Real>: Into<T>;
fn ifft(&mut self)
where T: ComplexFloat<Real: Float> + MulAssign + AddAssign + MulAssign<T::Real> + Sum,
Complex<T::Real>: Into<T>;
fn fwht_unscaled(&mut self)
where T: Add<Output = T> + Sub<Output = T> + Copy;
fn fwht(&mut self)
where T: ComplexFloat + MulAssign<T::Real>;
fn ifwht(&mut self)
where T: ComplexFloat + MulAssign<T::Real>;
fn fht(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign;
fn ifht(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + MulAssign<T::Real>;
fn dst_i(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + DivAssign<T::Real>;
fn dst_ii(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign;
fn dst_iii(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + MulAssign<T::Real> + Mul<T, Output = Complex<T::Real>>;
fn dst_iv(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + Mul<T, Output = Complex<T::Real>>;
fn dct_i(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + DivAssign<T::Real> + 'static,
Complex<T::Real>: AddAssign + MulAssign + DivAssign<T::Real>;
fn dct_ii(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign;
fn dct_iii(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + Mul<T, Output = Complex<T::Real>> + DivAssign<T::Real>;
fn dct_iv(&mut self)
where T: ComplexFloat<Real: Into<T>> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + Mul<T, Output = Complex<T::Real>>;
fn real_fft(&self, y: &mut [Complex<T>])
where T: Float,
Complex<T>: ComplexFloat<Real = T> + MulAssign + AddAssign;
fn real_ifft(&mut self, x: &[Complex<T>])
where T: Float,
Complex<T>: ComplexFloat<Real = T> + MulAssign + AddAssign + MulAssign<T>;
fn polynomial<Rhs>(&self, rhs: Rhs) -> T
where T: AddAssign + MulAssign<Rhs> + Zero + Copy,
Rhs: Copy;
fn rpolynomial<Rhs>(&self, rhs: Rhs) -> T
where T: AddAssign + MulAssign<Rhs> + Zero + Copy,
Rhs: Copy;
fn derivate_polynomial<S>(&self) -> S
where T: NumCast + Zero + Mul + Copy,
S: FromIterator<<T as Mul>::Output>;
fn derivate_rpolynomial<S>(&self) -> S
where T: NumCast + Zero + Mul + Copy,
S: FromIterator<<T as Mul>::Output>;
fn integrate_polynomial<S>(&self, c: <T as Div>::Output) -> S
where T: NumCast + Zero + Div + Copy,
S: FromIterator<<T as Div>::Output>;
fn integrate_rpolynomial<S>(&self, c: <T as Div>::Output) -> S
where T: NumCast + Zero + Div + Copy,
S: FromIterator<<T as Div>::Output>;
fn trim_zeros(&self) -> &[T]
where T: Zero;
fn trim_zeros_front(&self) -> &[T]
where T: Zero;
fn trim_zeros_back(&self) -> &[T]
where T: Zero;
fn trim_zeros_mut(&mut self) -> &mut [T]
where T: Zero;
fn trim_zeros_front_mut(&mut self) -> &mut [T]
where T: Zero;
fn trim_zeros_back_mut(&mut self) -> &mut [T]
where T: Zero;
fn frac_rotate_right(&mut self, shift: T::Real)
where T: ComplexFloat<Real: Into<T> + SubAssign> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + MulAssign<T::Real>;
fn frac_rotate_left(&mut self, shift: T::Real)
where T: ComplexFloat<Real: Into<T> + SubAssign> + Into<Complex<T::Real>> + 'static,
Complex<T::Real>: AddAssign + MulAssign + MulAssign<T::Real>;
}Required Methods§
fn recip_assign_all(&mut self)where
T: Inv<Output = T>,
fn conj_assign_all(&mut self)where
T: ComplexFloat,
fn convolve_direct<Rhs, C>(&self, rhs: &[Rhs]) -> C
sourcefn convolve_real_fft<Rhs, C>(&self, rhs: &[Rhs]) -> Cwhere
T: Float + Copy,
Rhs: Float + Copy,
Complex<T>: MulAssign + AddAssign + ComplexFloat<Real = T> + Mul<Complex<Rhs>, Output: ComplexFloat<Real: Float>>,
Complex<Rhs>: MulAssign + AddAssign + ComplexFloat<Real = Rhs>,
<Complex<T> as Mul<Complex<Rhs>>>::Output: ComplexFloat<Real: Float> + Into<Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>>,
Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>: MulAssign + AddAssign + MulAssign<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real> + ComplexFloat<Real = <<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
C: FromIterator<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
fn convolve_real_fft<Rhs, C>(&self, rhs: &[Rhs]) -> Cwhere
T: Float + Copy,
Rhs: Float + Copy,
Complex<T>: MulAssign + AddAssign + ComplexFloat<Real = T> + Mul<Complex<Rhs>, Output: ComplexFloat<Real: Float>>,
Complex<Rhs>: MulAssign + AddAssign + ComplexFloat<Real = Rhs>,
<Complex<T> as Mul<Complex<Rhs>>>::Output: ComplexFloat<Real: Float> + Into<Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>>,
Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>: MulAssign + AddAssign + MulAssign<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real> + ComplexFloat<Real = <<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
C: FromIterator<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
Performs convolution using FFT.
§Examples
Convolution can be done directly O(n^2) or using FFT O(nlog(n)).
#![feature(generic_const_exprs)]
use slice_math::*;
let x = [1.0, 0.0, 1.5, 0.0, 0.0, -1.0];
let h = [1.0, 0.6, 0.3];
let y_fft: Vec<f64> = x.convolve_real_fft(&h);
let y_direct: Vec<f64> = x.convolve_direct(&h);
let avg_error = y_fft.into_iter()
.zip(y_direct.into_iter())
.map(|(y_fft, y_direct)| (y_fft - y_direct).abs())
.sum::<f64>()/x.len() as f64;
assert!(avg_error < 1.0e-15);fn convolve_fft<Rhs, C>(&self, rhs: &[Rhs]) -> Cwhere
T: ComplexFloat + Mul<Rhs, Output: ComplexFloat<Real: Into<<T as Mul<Rhs>>::Output>> + 'static> + Into<Complex<T::Real>>,
Rhs: ComplexFloat + Into<Complex<Rhs::Real>>,
Complex<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real>: Into<<Complex<T::Real> as Mul<Complex<Rhs::Real>>>::Output>,
Complex<T::Real>: AddAssign + MulAssign + Mul<Complex<Rhs::Real>, Output: ComplexFloat<Real = <<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + MulAssign + AddAssign + MulAssign<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + Sum + 'static>,
Complex<Rhs::Real>: AddAssign + MulAssign,
C: FromIterator<<T as Mul<Rhs>>::Output>,
fn cconvolve_direct<Rhs, C>(&self, rhs: &[Rhs]) -> C
fn cconvolve_real_fft<Rhs, C>(&self, rhs: &[Rhs]) -> Cwhere
T: Float + Copy,
Rhs: Float + Copy,
Complex<T>: MulAssign + AddAssign + ComplexFloat<Real = T> + Mul<Complex<Rhs>, Output: ComplexFloat<Real: Float>>,
Complex<Rhs>: MulAssign + AddAssign + ComplexFloat<Real = Rhs>,
<Complex<T> as Mul<Complex<Rhs>>>::Output: ComplexFloat<Real: Float> + Into<Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>>,
Complex<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>: MulAssign + AddAssign + MulAssign<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real> + ComplexFloat<Real = <<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
C: FromIterator<<<Complex<T> as Mul<Complex<Rhs>>>::Output as ComplexFloat>::Real>,
fn cconvolve_fft<Rhs, C>(&self, rhs: &[Rhs]) -> Cwhere
T: ComplexFloat + Mul<Rhs, Output: ComplexFloat<Real: Into<<T as Mul<Rhs>>::Output>> + 'static> + Into<Complex<T::Real>>,
Rhs: ComplexFloat + Into<Complex<Rhs::Real>>,
Complex<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real>: Into<<Complex<T::Real> as Mul<Complex<Rhs::Real>>>::Output>,
Complex<T::Real>: AddAssign + MulAssign + Mul<Complex<Rhs::Real>, Output: ComplexFloat<Real = <<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + MulAssign + AddAssign + MulAssign<<<T as Mul<Rhs>>::Output as ComplexFloat>::Real> + Sum + 'static>,
Complex<Rhs::Real>: AddAssign + MulAssign,
C: FromIterator<<T as Mul<Rhs>>::Output>,
fn dtft(&self, omega: T::Real) -> Complex<T::Real>where
T: ComplexFloat + Into<Complex<T::Real>>,
Complex<T::Real>: ComplexFloat<Real = T::Real> + MulAssign + AddAssign,
fn fft_unscaled<const I: bool>(&mut self)
sourcefn fft(&mut self)
fn fft(&mut self)
Performs an iterative, in-place radix-2 FFT algorithm as described in https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm#Data_reordering,_bit_reversal,_and_in-place_algorithms. If length is not a power of two, it uses the DFT, which is a lot slower.
§Examples
#![feature(generic_const_exprs)]
use num::Complex;
use slice_math::*;
let x = [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0]
.map(|x| <Complex<_> as From<_>>::from(x));
let mut y = x;
y.as_mut_slice().fft();
y.as_mut_slice().ifft();
let avg_error = x.into_iter()
.zip(y.into_iter())
.map(|(x, y)| (x - y).norm())
.sum::<f64>()/x.len() as f64;
assert!(avg_error < 1.0e-16);sourcefn ifft(&mut self)
fn ifft(&mut self)
Performs an iterative, in-place radix-2 IFFT algorithm as described in https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm#Data_reordering,_bit_reversal,_and_in-place_algorithms. If length is not a power of two, it uses the IDFT, which is a lot slower.
§Examples
#![feature(generic_const_exprs)]
use num::Complex;
use slice_math::*;
let x = [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0]
.map(|x| <Complex<_> as From<_>>::from(x));
let mut y = x;
y.as_mut_slice().fft();
y.as_mut_slice().ifft();
let avg_error = x.into_iter()
.zip(y.into_iter())
.map(|(x, y)| (x - y).norm())
.sum::<f64>()/x.len() as f64;
assert!(avg_error < 1.0e-16);sourcefn fwht_unscaled(&mut self)
fn fwht_unscaled(&mut self)
Walsh-Hadamard transform
fn fht(&mut self)
fn ifht(&mut self)
fn dst_i(&mut self)
fn dst_ii(&mut self)
fn dst_iii(&mut self)
fn dst_iv(&mut self)
fn dct_i(&mut self)
fn dct_ii(&mut self)
fn dct_iii(&mut self)
fn dct_iv(&mut self)
fn real_fft(&self, y: &mut [Complex<T>])
fn real_ifft(&mut self, x: &[Complex<T>])
fn polynomial<Rhs>(&self, rhs: Rhs) -> T
fn rpolynomial<Rhs>(&self, rhs: Rhs) -> T
fn derivate_polynomial<S>(&self) -> S
fn derivate_rpolynomial<S>(&self) -> S
fn integrate_polynomial<S>(&self, c: <T as Div>::Output) -> S
fn integrate_rpolynomial<S>(&self, c: <T as Div>::Output) -> S
fn trim_zeros(&self) -> &[T]where
T: Zero,
fn trim_zeros_front(&self) -> &[T]where
T: Zero,
fn trim_zeros_back(&self) -> &[T]where
T: Zero,
fn trim_zeros_mut(&mut self) -> &mut [T]where
T: Zero,
fn trim_zeros_front_mut(&mut self) -> &mut [T]where
T: Zero,
fn trim_zeros_back_mut(&mut self) -> &mut [T]where
T: Zero,
fn frac_rotate_right(&mut self, shift: T::Real)
fn frac_rotate_left(&mut self, shift: T::Real)
Object Safety§
This trait is not object safe.