Back
//---------------------------------------------------------------------------
// N.V.Shokhirev
// created: 20040809
// modified: 20040809
// modified: 20060103 - switched to real
//---------------------------------------------------------------------------
#ifndef dynarrutilsH
#define dynarrutilsH
#include <math.h>
#include <stdlib.h>
#include "MatUtils.h"
#include "dynarrays.h"
//---------------------------------------------------------------------------

bool SameLim(Lim1D& a1, Lim1D& a2);

bool SameLim(Lim2D& a1, Lim2D& a2);

bool IsSquare(Lim2D& a);

// Diff = max(abs(a1[i] - a2[i]))
real Diff(FArr1D& a1, FArr1D& a2);

// Diff = max(abs(a1[i,j] - a2[i,j]))
real Diff(FArr2D& a1, FArr2D& a2);

// minval = min(a[i,j])
real minval(FArr1D& a, int& i);

// maxval = max(a[i,j])
real maxval(FArr1D& a, int& i);

// maxval = max(abs(a[i,j]))
real maxabs(FArr1D& a, int& i);

// if reset then amin = min(a[i]); amax = max(a[i])
//          else amin = min(amin, a[i]); amax = max(amax, a[i])
void minmax(FArr1D& a, real& amin, real& amax, bool reset);

bool Equal(real x1, real x2, real eps = eps0);

bool Equal(IArr1D& a1, IArr1D& a2);

bool Equal(FArr1D& a1, FArr1D& a2, real eps = eps0); // return (Diff(a1, a2) < eps);

bool Equal(FArr2D& a1, FArr2D& a2, real eps = eps0); // return (Diff(a1, a2) < eps);

// random vector: v1 <= a[i,j] <= v2
void RandArr(IArr1D& a, int v1, int v2);

// random vector: v1 <= a[i,j] <= v2
void RandArr(FArr1D& a, real v1, real v2);

/* random matrix: v1 <= a[i,j] <= v2
sym = 0 - no symmetry
for square a: if sym > 0 then a is symmetric if sym < 0 then a is antisymmetric */
void RandArr(FArr2D& a, real v1, real v2, int sym = 0);

// a[i,i] = a[i,i] + v
void ShiftDiag(FArr2D& a, real v);

// a = v*a
void MultArr(FArr1D& a, real v);

// a = v*a
void MultArr(FArr2D& a, real v);

// Norm2 = (a1*a1)
real Norm2(FArr1D& a1);

// Dot = (a1*a2) - dot or scalar product
real Dot(FArr1D& a1, FArr1D& a2);

// Combine = v1*a1 + v2*a2
FArr1D Combine(real v1, FArr1D& a1, real v2, FArr1D& a2);

// Combine = v1*a1 + v2*a2
FArr2D Combine(real v1, FArr2D& a1, real v2, FArr2D& a2);

// MT = Transpose( a )
FArr2D MT(FArr2D& a);

// MxV = a1 * a2 - vector
FArr1D MxV(FArr2D& a1, FArr1D& a2);

// VxM = a1 * a2 - vector
FArr1D VxM(FArr1D& a1, FArr2D& a2);

// MxM = a1 * a2 - matrix
FArr2D MxM(FArr2D& a1, FArr2D& a2);

/* Fourier transform T0[j] corresponds to non-centered frequency        <br>
                         Q[j] = j*2*Pi/(dT*N)   j = 0, 1, 2, .. , N-1   <br>
   Centered frequency: F[j] = j*2*Pi/(dT*N)  Mmin <= j <= Mmax          <br>
   where Mmin = -((N-1) div 2), Mmax = (M div 2)                        <br>
   The transform corresponding to the centered frequency                <br>
                                    C[m] = T0[ m ]  0 <= m <= Mmax      <br>
                                    C[m] = T0[N-m]  Mmin <= m < 0       <br> */
void CenterToTrans(FArr1D& T, FArr1D& C);

void TransToCenter(FArr1D& T, FArr1D& C);


//  if(i < L) i += D; else if (i > H) i -= D;   return i;
int cycle(int i, int L, int H, int D);

//  if (cyclic) // a(i+D) = a(i-D) = a(i)
//  else 0 outside limits
real extend(FArr1D& a, int i, bool cyclic);

//  if (cyclic) // a[0..N] a(0) = a(N);  a[0] is not used
//  else 0 outside limits
real extend0(FArr1D& a, int i, bool cyclic);

//  5-point 2nd degree smoothing; p1 = p0 - OK
void Smooth5(FArr1D& p0, FArr1D& p1);


#endif

Back