Intel® oneAPI Math Kernel Library Developer Reference - C
This section presents C examples for conversion from the Cartesian to polar representation of complex data and vice versa.
// Cartesian->polar conversion of complex data // Cartesian representation: z = re + I*im // Polar representation: z = r * exp( I*phi ) #include <mkl_vml.h> void variant1_Cartesian2Polar(int n,const double *re,const double *im, double *r,double *phi) { vdHypot(n,re,im,r); // compute radii r[] vdAtan2(n,im,re,phi); // compute phases phi[] } void variant2_Cartesian2Polar(int n,const MKL_Complex16 *z,double *r,double *phi, double *temp_re,double *temp_im) { vzAbs(n,z,r); // compute radii r[] vdPackI(n, (double*)z + 0, 2, temp_re); vdPackI(n, (double*)z + 1, 2, temp_im); vdAtan2(n,temp_im,temp_re,phi); // compute phases phi[] }
// Polar->Cartesian conversion of complex data. // Polar representation: z = r * exp( I*phi ) // Cartesian representation: z = re + I*im #include <mkl_vml.h> void variant1_Polar2Cartesian(int n,const double *r,const double *phi, double *re,double *im) { vdSinCos(n,phi,im,re); // compute direction, i.e. z[]/abs(z[]) vdMul(n,r,re,re); // scale real part vdMul(n,r,im,im); // scale imaginary part } void variant2_Polar2Cartesian(int n,const double *r,const double *phi, MKL_Complex16 *z, double *temp_re,double *temp_im) { vdSinCos(n,phi,temp_im,temp_re); // compute direction, i.e. z[]/abs(z[]) vdMul(n,r,temp_im,temp_im); // scale imaginary part vdMul(n,r,temp_re,temp_re); // scale real part vdUnpackI(n,temp_re,(double*)z + 0, 2); // fill in result.re vdUnpackI(n,temp_im,(double*)z + 1, 2); // fill in result.im }