#[repr(C)]pub struct Complex<T> {
pub re: T,
pub im: T,
}Expand description
A complex number in Cartesian form.
§Representation and Foreign Function Interface Compatibility
Complex<T> is memory layout compatible with an array [T; 2].
Note that Complex<F> where F is a floating point type is only memory
layout compatible with C’s complex types, not necessarily calling
convention compatible. This means that for FFI you can only pass
Complex<F> behind a pointer, not as a value.
§Examples
Example of extern function declaration.
use num_complex::Complex;
use std::os::raw::c_int;
extern "C" {
fn zaxpy_(n: *const c_int, alpha: *const Complex<f64>,
x: *const Complex<f64>, incx: *const c_int,
y: *mut Complex<f64>, incy: *const c_int);
}Fields§
§re: TReal portion of the complex number
im: TImaginary portion of the complex number
Implementations§
Source§impl<T> Complex<T>
impl<T> Complex<T>
Source§impl<T> Complex<T>
impl<T> Complex<T>
Sourcepub fn l1_norm(&self) -> T
pub fn l1_norm(&self) -> T
Returns the L1 norm |re| + |im| – the Manhattan distance from the origin.
Trait Implementations§
Source§impl<'a, T> AddAssign<&'a Complex<T>> for Complex<T>
impl<'a, T> AddAssign<&'a Complex<T>> for Complex<T>
Source§fn add_assign(&mut self, other: &Complex<T>)
fn add_assign(&mut self, other: &Complex<T>)
+= operation. Read moreSource§impl<'a, T> AddAssign<&'a T> for Complex<T>
impl<'a, T> AddAssign<&'a T> for Complex<T>
Source§fn add_assign(&mut self, other: &T)
fn add_assign(&mut self, other: &T)
+= operation. Read moreSource§impl<T> AddAssign<T> for Complex<T>
impl<T> AddAssign<T> for Complex<T>
Source§fn add_assign(&mut self, other: T)
fn add_assign(&mut self, other: T)
+= operation. Read moreSource§impl<T> AddAssign for Complex<T>
impl<T> AddAssign for Complex<T>
Source§fn add_assign(&mut self, other: Complex<T>)
fn add_assign(&mut self, other: Complex<T>)
+= operation. Read moreSource§impl<T, U> AsPrimitive<U> for Complex<T>where
T: AsPrimitive<U>,
U: 'static + Copy,
impl<T, U> AsPrimitive<U> for Complex<T>where
T: AsPrimitive<U>,
U: 'static + Copy,
Source§impl ComplexExt<i32, u32> for Complex<i32>
impl ComplexExt<i32, u32> for Complex<i32>
Source§fn from_angle(angle: i32) -> Self
fn from_angle(angle: i32) -> Self
Return a Complex on the unit circle given an angle.
Example:
use idsp::{Complex, ComplexExt};
Complex::<i32>::from_angle(0);
Complex::<i32>::from_angle(1 << 30); // pi/2
Complex::<i32>::from_angle(-1 << 30); // -pi/2Source§fn abs_sqr(&self) -> u32
fn abs_sqr(&self) -> u32
Return the absolute square (the squared magnitude).
Note: Normalization is 1 << 32, i.e. U0.32.
Note(panic): This will panic for Complex(i32::MIN, i32::MIN)
Example:
use idsp::{Complex, ComplexExt};
assert_eq!(Complex::new(i32::MIN, 0).abs_sqr(), 1 << 31);
assert_eq!(Complex::new(i32::MAX, i32::MAX).abs_sqr(), u32::MAX - 3);Source§fn log2(&self) -> i32
fn log2(&self) -> i32
log2(power) re full scale approximation
TODO: scale up, interpolate
Panic:
This will panic for Complex(i32::MIN, i32::MIN)
Example:
use idsp::{Complex, ComplexExt};
assert_eq!(Complex::new(i32::MAX, i32::MAX).log2(), -1);
assert_eq!(Complex::new(i32::MAX, 0).log2(), -2);
assert_eq!(Complex::new(1, 0).log2(), -63);
assert_eq!(Complex::new(0, 0).log2(), -64);Source§fn arg(&self) -> i32
fn arg(&self) -> i32
Return the angle.
Note: Normalization is 1 << 31 == pi.
Example:
use idsp::{Complex, ComplexExt};
assert_eq!(Complex::new(0, 0).arg(), 0);Source§fn saturating_add(&self, other: Self) -> Self
fn saturating_add(&self, other: Self) -> Self
Source§fn saturating_sub(&self, other: Self) -> Self
fn saturating_sub(&self, other: Self) -> Self
Source§impl<'de, T> Deserialize<'de> for Complex<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Complex<T>where
T: Deserialize<'de>,
Source§fn deserialize<D>(
deserializer: D,
) -> Result<Complex<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Complex<T>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl<'a, T> DivAssign<&'a Complex<T>> for Complex<T>
impl<'a, T> DivAssign<&'a Complex<T>> for Complex<T>
Source§fn div_assign(&mut self, other: &Complex<T>)
fn div_assign(&mut self, other: &Complex<T>)
/= operation. Read moreSource§impl<'a, T> DivAssign<&'a T> for Complex<T>
impl<'a, T> DivAssign<&'a T> for Complex<T>
Source§fn div_assign(&mut self, other: &T)
fn div_assign(&mut self, other: &T)
/= operation. Read moreSource§impl<T> DivAssign<T> for Complex<T>
impl<T> DivAssign<T> for Complex<T>
Source§fn div_assign(&mut self, other: T)
fn div_assign(&mut self, other: T)
/= operation. Read moreSource§impl<T> DivAssign for Complex<T>
impl<T> DivAssign for Complex<T>
Source§fn div_assign(&mut self, other: Complex<T>)
fn div_assign(&mut self, other: Complex<T>)
/= operation. Read moreSource§impl<T> FromPrimitive for Complex<T>where
T: FromPrimitive + Num,
impl<T> FromPrimitive for Complex<T>where
T: FromPrimitive + Num,
Source§fn from_usize(n: usize) -> Option<Complex<T>>
fn from_usize(n: usize) -> Option<Complex<T>>
usize to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_isize(n: isize) -> Option<Complex<T>>
fn from_isize(n: isize) -> Option<Complex<T>>
isize to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u8(n: u8) -> Option<Complex<T>>
fn from_u8(n: u8) -> Option<Complex<T>>
u8 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u16(n: u16) -> Option<Complex<T>>
fn from_u16(n: u16) -> Option<Complex<T>>
u16 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u32(n: u32) -> Option<Complex<T>>
fn from_u32(n: u32) -> Option<Complex<T>>
u32 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u64(n: u64) -> Option<Complex<T>>
fn from_u64(n: u64) -> Option<Complex<T>>
u64 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i8(n: i8) -> Option<Complex<T>>
fn from_i8(n: i8) -> Option<Complex<T>>
i8 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i16(n: i16) -> Option<Complex<T>>
fn from_i16(n: i16) -> Option<Complex<T>>
i16 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i32(n: i32) -> Option<Complex<T>>
fn from_i32(n: i32) -> Option<Complex<T>>
i32 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_i64(n: i64) -> Option<Complex<T>>
fn from_i64(n: i64) -> Option<Complex<T>>
i64 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned.Source§fn from_u128(n: u128) -> Option<Complex<T>>
fn from_u128(n: u128) -> Option<Complex<T>>
u128 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned. Read moreSource§fn from_i128(n: i128) -> Option<Complex<T>>
fn from_i128(n: i128) -> Option<Complex<T>>
i128 to return an optional value of this type. If the
value cannot be represented by this type, then None is returned. Read moreSource§impl<'a, 'b, T> MulAddAssign<&'a Complex<T>, &'b Complex<T>> for Complex<T>
impl<'a, 'b, T> MulAddAssign<&'a Complex<T>, &'b Complex<T>> for Complex<T>
Source§fn mul_add_assign(&mut self, other: &Complex<T>, add: &Complex<T>)
fn mul_add_assign(&mut self, other: &Complex<T>, add: &Complex<T>)
*self = (*self * a) + bSource§impl<T> MulAddAssign for Complex<T>
impl<T> MulAddAssign for Complex<T>
Source§fn mul_add_assign(&mut self, other: Complex<T>, add: Complex<T>)
fn mul_add_assign(&mut self, other: Complex<T>, add: Complex<T>)
*self = (*self * a) + bSource§impl<'a, T> MulAssign<&'a Complex<T>> for Complex<T>
impl<'a, T> MulAssign<&'a Complex<T>> for Complex<T>
Source§fn mul_assign(&mut self, other: &Complex<T>)
fn mul_assign(&mut self, other: &Complex<T>)
*= operation. Read moreSource§impl<'a, T> MulAssign<&'a T> for Complex<T>
impl<'a, T> MulAssign<&'a T> for Complex<T>
Source§fn mul_assign(&mut self, other: &T)
fn mul_assign(&mut self, other: &T)
*= operation. Read moreSource§impl<T> MulAssign<T> for Complex<T>
impl<T> MulAssign<T> for Complex<T>
Source§fn mul_assign(&mut self, other: T)
fn mul_assign(&mut self, other: T)
*= operation. Read moreSource§impl<T> MulAssign for Complex<T>
impl<T> MulAssign for Complex<T>
Source§fn mul_assign(&mut self, other: Complex<T>)
fn mul_assign(&mut self, other: Complex<T>)
*= operation. Read moreSource§impl MulScaled<Complex<i32>> for Complex<i32>
impl MulScaled<Complex<i32>> for Complex<i32>
Source§fn mul_scaled(self, other: Self) -> Self
fn mul_scaled(self, other: Self) -> Self
Source§impl MulScaled<i16> for Complex<i32>
impl MulScaled<i16> for Complex<i32>
Source§fn mul_scaled(self, other: i16) -> Self
fn mul_scaled(self, other: i16) -> Self
Source§impl MulScaled<i32> for Complex<i32>
impl MulScaled<i32> for Complex<i32>
Source§fn mul_scaled(self, other: i32) -> Self
fn mul_scaled(self, other: i32) -> Self
Source§impl<T> Num for Complex<T>
impl<T> Num for Complex<T>
Source§fn from_str_radix(
s: &str,
radix: u32,
) -> Result<Complex<T>, <Complex<T> as Num>::FromStrRadixErr>
fn from_str_radix( s: &str, radix: u32, ) -> Result<Complex<T>, <Complex<T> as Num>::FromStrRadixErr>
Parses a +/- bi; ai +/- b; a; or bi where a and b are of type T
radix must be <= 18; larger radix would include i and j as digits,
which cannot be supported.
The conversion returns an error if 18 <= radix <= 36; it panics if radix > 36.
The elements of T are parsed using Num::from_str_radix too, and errors
(or panics) from that are reflected here as well.
type FromStrRadixErr = ParseComplexError<<T as Num>::FromStrRadixErr>
Source§impl<'a, T> RemAssign<&'a Complex<T>> for Complex<T>
impl<'a, T> RemAssign<&'a Complex<T>> for Complex<T>
Source§fn rem_assign(&mut self, other: &Complex<T>)
fn rem_assign(&mut self, other: &Complex<T>)
%= operation. Read moreSource§impl<'a, T> RemAssign<&'a T> for Complex<T>
impl<'a, T> RemAssign<&'a T> for Complex<T>
Source§fn rem_assign(&mut self, other: &T)
fn rem_assign(&mut self, other: &T)
%= operation. Read moreSource§impl<T> RemAssign<T> for Complex<T>
impl<T> RemAssign<T> for Complex<T>
Source§fn rem_assign(&mut self, other: T)
fn rem_assign(&mut self, other: T)
%= operation. Read moreSource§impl<T> RemAssign for Complex<T>
impl<T> RemAssign for Complex<T>
Source§fn rem_assign(&mut self, modulus: Complex<T>)
fn rem_assign(&mut self, modulus: Complex<T>)
%= operation. Read moreSource§impl<T> Serialize for Complex<T>where
T: Serialize,
impl<T> Serialize for Complex<T>where
T: Serialize,
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Source§impl<'a, T> SubAssign<&'a Complex<T>> for Complex<T>
impl<'a, T> SubAssign<&'a Complex<T>> for Complex<T>
Source§fn sub_assign(&mut self, other: &Complex<T>)
fn sub_assign(&mut self, other: &Complex<T>)
-= operation. Read moreSource§impl<'a, T> SubAssign<&'a T> for Complex<T>
impl<'a, T> SubAssign<&'a T> for Complex<T>
Source§fn sub_assign(&mut self, other: &T)
fn sub_assign(&mut self, other: &T)
-= operation. Read moreSource§impl<T> SubAssign<T> for Complex<T>
impl<T> SubAssign<T> for Complex<T>
Source§fn sub_assign(&mut self, other: T)
fn sub_assign(&mut self, other: T)
-= operation. Read moreSource§impl<T> SubAssign for Complex<T>
impl<T> SubAssign for Complex<T>
Source§fn sub_assign(&mut self, other: Complex<T>)
fn sub_assign(&mut self, other: Complex<T>)
-= operation. Read moreSource§impl<T> ToPrimitive for Complex<T>where
T: ToPrimitive + Num,
impl<T> ToPrimitive for Complex<T>where
T: ToPrimitive + Num,
Source§fn to_usize(&self) -> Option<usize>
fn to_usize(&self) -> Option<usize>
self to a usize. If the value cannot be
represented by a usize, then None is returned.Source§fn to_isize(&self) -> Option<isize>
fn to_isize(&self) -> Option<isize>
self to an isize. If the value cannot be
represented by an isize, then None is returned.Source§fn to_u8(&self) -> Option<u8>
fn to_u8(&self) -> Option<u8>
self to a u8. If the value cannot be
represented by a u8, then None is returned.Source§fn to_u16(&self) -> Option<u16>
fn to_u16(&self) -> Option<u16>
self to a u16. If the value cannot be
represented by a u16, then None is returned.Source§fn to_u32(&self) -> Option<u32>
fn to_u32(&self) -> Option<u32>
self to a u32. If the value cannot be
represented by a u32, then None is returned.Source§fn to_u64(&self) -> Option<u64>
fn to_u64(&self) -> Option<u64>
self to a u64. If the value cannot be
represented by a u64, then None is returned.Source§fn to_i8(&self) -> Option<i8>
fn to_i8(&self) -> Option<i8>
self to an i8. If the value cannot be
represented by an i8, then None is returned.Source§fn to_i16(&self) -> Option<i16>
fn to_i16(&self) -> Option<i16>
self to an i16. If the value cannot be
represented by an i16, then None is returned.Source§fn to_i32(&self) -> Option<i32>
fn to_i32(&self) -> Option<i32>
self to an i32. If the value cannot be
represented by an i32, then None is returned.Source§fn to_i64(&self) -> Option<i64>
fn to_i64(&self) -> Option<i64>
self to an i64. If the value cannot be
represented by an i64, then None is returned.Source§fn to_u128(&self) -> Option<u128>
fn to_u128(&self) -> Option<u128>
self to a u128. If the value cannot be
represented by a u128 (u64 under the default implementation), then
None is returned. Read moreSource§fn to_i128(&self) -> Option<i128>
fn to_i128(&self) -> Option<i128>
self to an i128. If the value cannot be
represented by an i128 (i64 under the default implementation), then
None is returned. Read moreimpl<T> Copy for Complex<T>where
T: Copy,
impl<T> Eq for Complex<T>where
T: Eq,
impl<T> Pod for Complex<T>where
T: Pod,
impl<T> StructuralPartialEq for Complex<T>
Auto Trait Implementations§
impl<T> Freeze for Complex<T>where
T: Freeze,
impl<T> RefUnwindSafe for Complex<T>where
T: RefUnwindSafe,
impl<T> Send for Complex<T>where
T: Send,
impl<T> Sync for Complex<T>where
T: Sync,
impl<T> Unpin for Complex<T>where
T: Unpin,
impl<T> UnwindSafe for Complex<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
impl<T> CheckedBitPattern for Twhere
T: AnyBitPattern,
§type Bits = T
type Bits = T
Self must have the same layout as the specified Bits except for
the possible invalid bit patterns being checked during
is_valid_bit_pattern.§fn is_valid_bit_pattern(_bits: &T) -> bool
fn is_valid_bit_pattern(_bits: &T) -> bool
bits
as &Self.