7.7 Изменение данных

These functions change the data in some direction like differentiations, integrations and so on. The direction in which the change will applied is specified by the string parameter, which may contain ‘x’, ‘y’ or ‘z’ characters for 1-st, 2-nd and 3-d dimension correspondingly.

Команда MGL: cumsum dat 'dir'
Метод класса mglData: void CumSum (const char *dir)
Метод класса mglDataC: void CumSum (const char *dir)
Функция С: void mgl_data_cumsum (HMDT dat, const char *dir)
Функция С: void mgl_datac_cumsum (HADT dat, const char *dir)

Суммирует с накоплением в выбранном направлении(ях).

Команда MGL: integrate dat 'dir'
Метод класса mglData: void Integral (const char *dir)
Метод класса mglDataC: void Integral (const char *dir)
Функция С: void mgl_data_integral (HMDT dat, const char *dir)
Функция С: void mgl_datac_integral (HADT dat, const char *dir)

Выполняет интегрирование (методом трапеций) в выбранном направлении(ях).

Команда MGL: diff dat 'dir'
Метод класса mglData: void Diff (const char *dir)
Метод класса mglDataC: void Diff (const char *dir)
Функция С: void mgl_data_diff (HMDT dat, const char *dir)
Функция С: void mgl_datac_diff (HADT dat, const char *dir)

Выполняет дифференцирование в выбранном направлении(ях).

Команда MGL: diff dat xdat ydat [zdat]
Метод класса mglData: void Diff (const mglDataA &x)
Метод класса mglData: void Diff (const mglDataA &x, const mglDataA &y)
Метод класса mglData: void Diff (const mglDataA &x, const mglDataA &y, const mglDataA &z)
Метод класса mglDataC: void Diff (const mglDataA &x)
Метод класса mglDataC: void Diff (const mglDataA &x, const mglDataA &y)
Метод класса mglDataC: void Diff (const mglDataA &x, const mglDataA &y, const mglDataA &z)
Функция С: void mgl_data_diff_par (HMDT dat, HCDT x, HCDTy, HCDTz)
Функция С: void mgl_datac_diff_par (HADT dat, HCDT x, HCDTy, HCDTz)

Выполняет дифференцирование данных, параметрически зависящих от координат, в направлении x с y, z=constant. Параметр z может быть опущен, что соответствует 2D случаю. Используются следующие формулы (2D случай): da/dx = (a_j*y_i-a_i*y_j)/(x_j*y_i-x_i*y_j), где a_i=da/di, a_j=da/dj обозначает дифференцирование вдоль 1-ой и 2-ой размерности. Похожие формулы используются и в 3D случае. Порядок аргументов можно менять – например, если данные a(i,j) зависят от координат {x(i,j), y(i,j)}, то обычная производная по ‘x’ будет равна Diff(x,y);, а обычная производная по ‘y’ будет равна Diff(y,x);.

Команда MGL: diff2 dat 'dir'
Метод класса mglData: void Diff2 (const char *dir)
Метод класса mglDataC: void Diff2 (const char *dir)
Функция С: void mgl_data_diff2 (HMDT dat, const char *dir)
Функция С: void mgl_datac_diff2 (HADT dat, const char *dir)

Выполняет двойное дифференцирование (как в операторе Лапласа) в выбранном направлении(ях).

Команда MGL: sinfft dat 'dir'
Метод класса mglData: void SinFFT (const char *dir)
Функция С: void mgl_data_sinfft (HMDT dat, const char *dir)

Выполняет синус преобразование в выбранном направлении(ях). Синус преобразование есть \sum a_j \sin(k j) (см. http://en.wikipedia.org/wiki/Discrete_sine_transform#DST-I).

Команда MGL: cosfft dat 'dir'
Метод класса mglData: void CosFFT (const char *dir)
Функция С: void mgl_data_cosfft (HMDT dat, const char *dir)

Выполняет косинус преобразование в выбранном направлении(ях). Синус преобразование есть \sum a_j \cos(k j) (см. http://en.wikipedia.org/wiki/Discrete_cosine_transform#DCT-I).

Метод класса mglDataC: void FFT (const char *dir)
Функция С: void mgl_datac_fft (HADT dat, const char *dir)

Выполняет фурье преобразование в выбранном направлении(ях). Если строка dir содержит ‘i’, то используется обратное преобразование фурье. Фурье преобразование есть \sum a_j \exp(i k j) (см. http://en.wikipedia.org/wiki/Discrete_Fourier_transform).

Команда MGL: hankel dat 'dir'
Метод класса mglData: void Hankel (const char *dir)
Метод класса mglDataC: void Hankel (const char *dir)
Функция С: void mgl_data_hankel (HMDT dat, const char *dir)
Функция С: void mgl_datac_hankel (HADT dat, const char *dir)

Выполняет преобразование Ханкеля в выбранном направлении(ях). Преобразование Ханкеля есть \sum a_j J_0(k j) (см. http://en.wikipedia.org/wiki/Hankel_transform).

Команда MGL: wavelet dat 'dir' k
Метод класса mglData: void Wavelet (const char *dir, int k)
Функция С: void mgl_data_wavelet (HMDT dat, const char *dir, int k)

Выполняет преобразование wavelet в выбранном направлении(ях). Параметр dir задает тип: ‘d’ для daubechies, ‘D’ для центрированного daubechies, ‘h’ для haar, ‘H’ для центрированного haar, ‘b’ для bspline, ‘B’ для центрированного bspline. Если указан символ ‘i’, то выполняется обратное преобразование. Параметр k задает размер преобразования.

Команда MGL: swap dat 'dir'
Метод класса mglData: void Swap (const char *dir)
Метод класса mglDataC: void Swap (const char *dir)
Функция С: void mgl_data_swap (HMDT dat, const char *dir)
Функция С: void mgl_datac_swap (HADT dat, const char *dir)

Меняет местами левую и правую части данных в выбранном направлении(ях). Полезно для отображения результата FFT.

Команда MGL: roll dat 'dir' num
Метод класса mglData: void Roll (char dir, num)
Метод класса mglDataC: void Roll (char dir, num)
Функция С: void mgl_data_roll (HMDT dat, char dir, num)
Функция С: void mgl_datac_roll (HADT dat, char dir, num)

Сдвигает данные на num ячеек в выбранном направлении(ях). Соответствует замене индекса на i->(i+num)%nx при dir='x'.

Команда MGL: mirror dat 'dir'
Метод класса mglData: void Mirror (const char *dir)
Метод класса mglDataC: void Mirror (const char *dir)
Функция С: void mgl_data_mirror (HMDT dat, const char *dir)
Функция С: void mgl_datac_mirror (HADT dat, const char *dir)

Отражает данные в выбранном направлении(ях). Соответствует замене индекса на i->n-i. Отмечу, что похожего эффекта на графике можно достичь используя опции (see Опции команд), например, surf dat; xrange 1 -1.

Команда MGL: sew dat ['dir'='xyz' da=2*pi]
Метод класса mglData: void Sew (const char *dir, mreal da=2*M_PI)
Функция С: void mgl_data_sew (HMDT dat, const char *dir, mreal da)

Удаляет скачки данных (например, скачки фазы после обратных тригонометрических функций) с периодом da в выбранном направлении(ях).

Команда MGL: smooth data ['dir'='xyz']
Метод класса mglData: void Smooth (const char *dir="xyz", mreal delta=0)
Метод класса mglDataC: void Smooth (const char *dir="xyz", mreal delta=0)
Функция С: void mgl_data_smooth (HMDT dat, const char *dir, mreal delta)
Функция С: void mgl_datac_smooth (HADT dat, const char *dir, mreal delta)

Сглаживает данные в выбранном направлении(ях) dir. Строка dirs задает направления вдоль которых будет производиться сглаживание. Строка dir может содержать:

  • xyz’ – сглаживание по x-,y-,z-направлениям,
  • 0’ – ничего не делает,
  • 3’ – линейное усреднение по 3 точкам,
  • 5’ – линейное усреднение по 5 точкам,
  • d1’...‘d9’ – линейное усреднение по (2*N+1) точкам,
  • p1’...‘p9’ – параболличсеское усреднение по (2*N+1) точкам,
  • ^’ – определение верхней границы,
  • _’ – определение нижней границы.

По умолчанию используется квадратичное усреднение по 5 точкам.

Команда MGL: envelop dat ['dir'='x']
Метод класса mglData: void Envelop (char dir='x')
Функция С: void mgl_data_envelop (HMDT dat, char dir)

Находит огибающую данных в выбранном направлении dir.

Команда MGL: diffract dat 'how' q
Метод класса mglDataC: void Diffraction (const char *how, mreal q)
Функция С: void mgl_datac_diffr (HADT dat, const char *how, mreal q)

Вычисляет один шаг диффракции в конечно-разностной схеме с параметром q=\delta t/\delta x^2 используя метод третьего порядка точности. Параметр how может содержать:

  • xyz’ для расчета вдоль x-,y-,z-направления;
  • r’ для аксиально симметричного лапласиана по направлению x;
  • 0’ для нулевых граничных условий;
  • 1’ для постоянных граничных условий;
  • 2’ для линейных граничных условий;
  • 3’ для параболлических граничных условий;
  • 4’ для экспоненциальных граничных условий;
  • 5’ для гауссовых граничных условий.
Команда MGL: norm dat v1 v2 [sym=off dim=0]
Метод класса mglData: void Norm (mreal v1=0, mreal v2=1, bool sym=false, long dim=0)
Функция С: void mgl_data_norm (HMDT dat, mreal v1, mreal v2, int sym, long dim)

Нормирует данные в интервал [v1,v2]. Если sym=true, то используется симметричный интервал [-max(|v1|,|v2|), max(|v1|,|v2|)]. Изменения применяются только к срезам >=dim.

Команда MGL: normsl dat v1 v2 ['dir'='z' keep=on sym=off]
Метод класса mglData: void NormSl (mreal v1=0, mreal v2=1, char dir='z', bool keep=true, bool sym=false)
Функция С: void mgl_data_norm_slice (HMDT dat, mreal v1, mreal v2, char dir, int keep, int sym)

Нормирует данные срез-за-срезом в выбранном направлении dir в интервал [v1,v2]. Если sym=true, то используется симметричный интервал [-max(|v1|,|v2|), max(|v1|,|v2|)]. Если keep=true, то максимальное значение k-го среза ограничено величиной \sqrt{\sum a_ij(k)/\sum a_ij(0)}.

Команда MGL: keep dat 'dir' i [j=0]
Метод класса mglData: void Keep (const char *dir, long i, long j=0)
Метод класса mglDataC: void Keep (const char *dir, long i, long j=0)
Функция С: void mgl_data_keep (HMDT dat, const char *dir, long i, long j)
Функция С: void mgl_datac_keep (HADT dat, const char *dir, long i, long j=0)

Ограничивает изменение фазы/знака или амплитуды (если dir содержит ‘a’) данных вдоль направления dir фиксируя значение в точке {i,j} начального среза. Функция полезна для удаления общего набега фазы в комплексных данных. См. раздел Sample ‘keep, для примеров кода и графика.

Команда MGL: limit dat val
Метод класса mglData: void Limit (mreal val)
Метод класса mglDataC: void Limit (mreal val)
Функция С: void mgl_data_limit (HMDT dat, mreal val)
Функция С: void mgl_datac_limit (HADT dat, mreal val)

Ограничивает амплитуду данных диапазоном [-val,val]. При этом сохраняется исходный знак (фаза для комплексных чисел). Эквивалентно операции a[i] *= abs(a[i])<val?1.:val/abs(a[i]);.

Команда MGL: coil dat v1 v2 [sep=on]
Метод класса mglData: void Coil (mreal v1, mreal v2, bool sep=true)
Функция С: void mgl_data_coil (HMDT dat, mreal v1, mreal v2, int sep)

Проецирует периодические данные на диапазон [v1,v2] (аналогично функции mod()). Разделяет ветки по значениям равным NAN если sep=true.

Команда MGL: dilate dat [val=1 step=1]
Метод класса mglData: void Dilate (mreal val=1, long step=1)
Функция С: void mgl_data_dilate (HMDT dat, mreal val, long step)

Возвращает "расширенный" на step ячеек массив из 0 и 1 для данных больших порогового значения val.

Команда MGL: erode dat [val=1 step=1]
Метод класса mglData: void Erode (mreal val=1, long step=1)
Функция С: void mgl_data_erode (HMDT dat, mreal val, long step)

Возвращает "суженный" на step ячеек массив из 0 и 1 для данных больших порогового значения val.

Команда MGL: mode dat mask 'how' kdx [iter=0]
Метод класса mglData: void Mode (const mglDataA &mask, const mglDataA &pot, const char *how, double kdx=0, long iter=0))
Метод класса mglData: void Mode (const mglDataA &mask, const char *how, double kdx=0, long iter=0))
Метод класса mglDataC: void Mode (const mglDataA &mask, const mglDataA &pot, const char *how, double kdx=0, long iter=0))
Метод класса mglDataC: void Mode (const mglDataA &mask, const char *how, double kdx=0, long iter=0))
Функция С: void mgl_data_mode (HMDT dat, HCDT mask, HCDT pot, const char *how, double kdx, long iter)
Функция С: void mgl_datac_mode (HADT dat, HCDT mask, HCDT pot, const char *how, double kdx, long iter)

Заменяет начальную моду d найденным решением для уравнения Пуассона u_xx+pot*u=0 в волноводе с границей определенной в mask. Если pot отсутствует (или NULL) то используются нулевые значения потенциала. Параметр how может содержать следующие символы (по умолчанию "xyz0"):

  • x’ для 1d случая с ny*nz вариантами,
  • y’ для 2d случая с nz вариантами,
  • 0’ для нулевых граничных условий: u[n] = 0,
  • 1’ для свободных граничных условий du/dx=0: u[n] = u[n-1],
  • 2’ для нуля лапласиана на границе d^2u/dx^2=0: u[n] = 2*u[n-1]-u[n-2],
  • s’ для 2-го типа граничных условий du/dx=k: u[n] = (4*u[n-1]-u[n-2]-2*kdx)/3,
  • r’ для излучательных граничных условий du/dx=k*u: u[n]=(4*u[n-1]-u[n-2])/(3+2*kdx),
  • i’ для излучательных граничных условий в случае комплексных массивов du/dx=i*k*u: u[n]=(4*u[n-1]-u[n-2])/(3+2i*kdx),
  • c’ для периодических граничных условий ( u[n] = u[0] ignore \a kdx),
  • +’ для фокусирующей нелинейности (т.е. для уравнения u_xx+pot*u + |u|^2 u=0),
  • -’ для дефокусирующей нелинейности (т.е. для уравнения u_xx+pot*u - |u|^2 u=0).

Параметр iter задает максимальное число итераций (выбирается автоматически для 0).