Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <assert.h>
#include <memory.h>
#ifdef _MATLAB_MEX_
#include "mex.h"
#define myprintf mexPrintf
#else
#include <stdlib.h>
#include <stdio.h>
#define myprintf printf
#endif
#include <math.h>
#include "complexarray.h"
int ComplexArrayCreate(ComplexArray* arr, unsigned int size)
{
assert(arr != 0);
#ifndef _MATLAB_MEX_
arr->r = malloc(sizeof(double)*size);
if (0 == arr->r)
goto ErrorLevel1;
arr->i = malloc(sizeof(double)*size);
if (0 == arr->i)
goto ErrorLevel2;
arr->count = size;
return 1;
ErrorLevel2:
free(arr->r);
ErrorLevel1:
arr->i = 0;
arr->r = 0;
arr->count = 0;
return 0;
#else
arr->mArr = mxCreateDoubleMatrix(1, size, mxCOMPLEX);
arr->r = mxGetPr(arr->mArr);
arr->i = mxGetPi(arr->mArr);
arr->count = size;
return 1;
#endif
}
void ComplexArrayDestroy(ComplexArray* arr)
{
assert(arr != 0);
#ifndef _MATLAB_MEX_
if (arr->r != 0)
{
free(arr->r);
arr->r = 0;
}
if (arr->i != 0)
{
free(arr->i);
arr->i = 0;
}
arr->count = 0;
#else
mxDestroyArray(arr->mArr);
arr->r = 0;
arr->i = 0;
arr->count = 0;
arr->mArr = 0;
#endif
}
void ComplexArrayPrint(const ComplexArray* arr)
{
unsigned int i;
assert(arr != 0);
for (i=0; i<arr->count; ++i)
{
if (arr->i[i] >= 0)
myprintf("%.3f + %.3fi\n", arr->r[i], arr->i[i]);
else
myprintf("%.3f - %.3fi\n", arr->r[i], fabs(arr->i[i]));
}
}
unsigned int NextRev(unsigned int r, unsigned int n)
{
do
{
n = n >> 1;
r = r^n;
} while ((r & n) == 0);
return r;
}
void ComplexArrayInverseOrder(ComplexArray *arr)
{
double tmpr, tmpi;
unsigned int x, r;
assert(arr != 0);
if (arr->count <= 2)
return;
r = 0;
for ( x = 1; x<arr->count; ++x)
{
r = NextRev(r, arr->count);
if (r > x)
{
tmpr = arr->r[x];
tmpi = arr->i[x];
arr->r[x] = arr->r[r];
arr->i[x] = arr->i[r];
arr->r[r] = tmpr;
arr->i[r] = tmpi;
}
}
}
void ComplexArrayCopy(const ComplexArray *arr, ComplexArray* out)
{
ComplexArrayCopyN(arr, out, arr->count);
}
void ComplexArrayCopyN(const ComplexArray *arr, ComplexArray* out, unsigned int N)
{
assert(arr != 0);
assert(out != 0);
assert(arr->count >= N);
assert(N <= out->count);
memcpy(out->r, arr->r, sizeof(double)*N);
memcpy(out->i, arr->i, sizeof(double)*N);
}
void ComplexArrayZero(ComplexArray *arr)
{
assert(arr != 0);
memset(arr->r, 0, sizeof(double)*arr->count);
memset(arr->i, 0, sizeof(double)*arr->count);
}
#ifdef _MATLAB_MEX_
void ComplexArrayFromMxArray(ComplexArray* arr, mxArray* mArr)
{
assert(arr != 0);
assert(mArr != 0);
arr->count = mxGetN(mArr);
arr->mArr = mArr;
arr->r = mxGetPr(mArr);
if (mxIsComplex(mArr))
{
arr->i = mxGetPi(mArr);
}
else
{
arr->i = mxCalloc(arr->count, sizeof(double));
}
}
void MxArrayFromComplexArray(mxArray** mArr, ComplexArray* arr)
{
assert(mArr != 0);
assert(*mArr != 0);
assert(arr != 0);
*mArr = arr->mArr;
mxSetPi(*mArr, arr->i);
}
#endif