#include "stdafx.h"
using namespace System;
using namespace System::Globalization;
public value struct Complex
{
Complex(double real, double imaginary)
{
Real = real;
Imaginary = imaginary;
}
static Complex Polar(double polarRadius, double polarPhase)
{
return Complex(polarRadius*Math::Cos(polarPhase), polarRadius*Math::Sin(polarPhase));
}
property double Real;
property double Imaginary;
property Complex Conjugate
{
Complex get()
{
return Complex(Real, -Imaginary);
}
}
// Absolute value
property double Absolute
{
double get()
{
return Math::Sqrt(Square);
}
}
// Absolute value squared
property double Square
{
double get()
{
return Real*Real + Imaginary*Imaginary;
}
}
// Poloar Radius
property double PolarRadius
{
double get()
{
return Absolute;
}
}
// Polar Angle
property double PolarAngle
{
double get()
{
return Math::Atan2(Imaginary, Real);
}
}
// Convert-from operator
static operator Complex(double a)
{
return Complex(a, 0.0);
}
// Unary +/- operators
static Complex operator +(Complex a)
{
return a;
}
static Complex operator -(Complex a)
{
return Complex(-a.Real, -a.Imaginary);
}
// Unary increment/decrement operators
static Complex operator --(Complex a)
{
return Complex(a.Real - 1, a.Imaginary);
}
static Complex operator ++(Complex a)
{
return Complex(a.Real + 1, a.Imaginary);
}
// Comparison operators
static bool operator ==(Complex a, Complex b)
{
return a.Real == b.Real && a.Imaginary == b.Imaginary;
}
static bool operator !=(Complex a, Complex b)
{
return a.Real != b.Real || a.Imaginary == b.Imaginary;
}
// Plus operators
static Complex operator +(Complex a, Complex b)
{
return Complex(a.Real + b.Real, a.Imaginary + b.Imaginary);
}
static Complex operator +(Complex a, double b)
{
return Complex(a.Real + b, a.Imaginary);
}
// Minus operators
static Complex operator -(Complex a, Complex b)
{
return Complex(a.Real - b.Real, a.Imaginary - b.Imaginary);
}
static Complex operator -(Complex a, double b)
{
return Complex(a.Real - b, a.Imaginary);
}
// Multiplication operators
static Complex operator *(Complex a, Complex b)
{
return Complex(a.Real*b.Real - a.Imaginary*b.Imaginary, a.Real*b.Imaginary + a.Imaginary*b.Real);
}
static Complex operator *(Complex a, double b)
{
return Complex(a.Real*b, a.Imaginary*b);
}
// Division operators
static Complex operator /(Complex a, Complex b)
{
double d = b.Square;
return Complex((a.Real*b.Real + a.Imaginary*b.Imaginary)/d, (b.Real*a.Imaginary - a.Real*b.Imaginary)/d);
}
static Complex operator /(Complex a, double b)
{
return Complex(a.Real/b, a.Imaginary/b);
}
static Complex operator /(double a, Complex b)
{
return Complex(a, 0)/b;
}
// Friendly alrernate operator methods
static Complex Plus(Complex a)
{
return a;
}
static Complex Negate(Complex a)
{
return Complex(-a.Real, -a.Imaginary);
}
static Complex Decrement(Complex a)
{
return Complex(a.Real - 1, a.Imaginary);
}
static Complex Increment(Complex a)
{
return Complex(a.Real + 1, a.Imaginary);
}
static Complex Add(Complex a, Complex b)
{
return Complex(a.Real + b.Real, a.Imaginary + b.Imaginary);
}
static Complex Add(Complex a, double b)
{
return Complex(a.Real + b, a.Imaginary);
}
static Complex Subtract(Complex a, Complex b)
{
return Complex(a.Real - b.Real, a.Imaginary - b.Imaginary);
}
static Complex Subtract(Complex a, double b)
{
return Complex(a.Real - b, a.Imaginary);
}
static Complex Multiply(Complex a, Complex b)
{
return Complex(a.Real*b.Real - a.Imaginary*b.Imaginary, a.Real*b.Imaginary + a.Imaginary*b.Real);
}
static Complex Multiply(Complex a, double b)
{
return Complex(a.Real*b, a.Imaginary*b);
}
static Complex Divide(Complex a, Complex b)
{
double d = b.Square;
return Complex((a.Real*b.Real + a.Imaginary*b.Imaginary)/d, (b.Real*a.Imaginary - a.Real*b.Imaginary)/d);
}
static Complex Divide(Complex a, double b)
{
return Complex(a.Real/b, a.Imaginary/b);
}
static Complex Divide(double a, Complex b)
{
return Complex(a, 0)/b;
}
virtual bool Equals(Object^ obj) override
{
Complex^ compareTo = dynamic_cast<Complex^>(obj);
if ( compareTo )
{
return *this == *compareTo;
}
else
{
return false;
}
}
virtual int GetHashCode() override
{
return Real.GetHashCode() ^ Imaginary.GetHashCode();
}
virtual String^ ToString() override
{
return String::Format(CultureInfo::CurrentCulture->NumberFormat,
"({0}, {1})", Real, Imaginary);
}
};
using namespace System;
void main()
{
array<Complex>^ data = gcnew array<Complex>(1024);
array<Complex>^ backup = gcnew array<Complex>(1024);
// 1st test
Random^ random = gcnew Random();
for ( int i = 0; i < data->Length; i++ )
{
data[i].Real = random->NextDouble();
data[i].Imaginary = random->NextDouble();
backup[i] = data[i];
}
FourierTransform^ fft = gcnew FourierTransform(data->Length, true);
fft->Forward(data);
fft->Inverse(data);
}