diff options
Diffstat (limited to 'complex_normal.hpp')
-rw-r--r-- | complex_normal.hpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/complex_normal.hpp b/complex_normal.hpp new file mode 100644 index 0000000..0819758 --- /dev/null +++ b/complex_normal.hpp @@ -0,0 +1,26 @@ +#pragma once +#include <complex> +#include <random> + +template <class T = double> class complex_normal_distribution { +private: + std::normal_distribution<T> d; + double δx; + double δy; + std::complex<T> μ; + std::complex<T> eθ; + +public: + complex_normal_distribution(std::complex<T> μ, T σ, std::complex<T> κ) : μ(μ), d(0, σ / sqrt(2)) { + δx = sqrt(1 + std::abs(κ)); + δy = sqrt(1 - std::abs(κ)); + eθ = std::polar(1.0, std::arg(κ)); + } + + template <class Generator> std::complex<T> operator()(Generator& g) { + // First generate an axis-aligned complex number centered at the origin. + std::complex<T> z(d(g) * δx, d(g) * δy); + // Shift and rotate the number. + return μ + eθ * z; + } +}; |