// Usuall mathematical functions and operations on arrays // R. Ansari, C.Magneville 03/2000 #include "machdefs.h" #include #include "matharr.h" // ---------------------------------------------------- // Application d'une fonction // ---------------------------------------------------- /*! \class SOPHYA::MathArray \ingroup TArray Class for simple mathematical operation on arrays \warning Instanciated only for \b real and \b double (r_4, r_8) type arrays */ //! Apply Function In Place (function double version) /*! \param a : array to be replaced in place \param f : function for replacement \return Return an array \b a filled with function f(a(i,j)) */ template TArray& MathArray::ApplyFunctionInPlace(TArray & a, Arr_DoubleFunctionOfX f) { if (a.NbDimensions() < 1) throw RangeCheckError("MathArray::ApplyFunctionInPlace(TArray & a..) Not Allocated Array a !"); T * pe; uint_8 j,k; if (a.AvgStep() > 0) { // regularly spaced elements uint_8 step = a.AvgStep(); uint_8 maxx = a.Size()*step; pe = a.Data(); for(k=0; k TArray& MathArray::ApplyFunctionInPlace(TArray & a, Arr_FloatFunctionOfX f) { if (a.NbDimensions() < 1) throw RangeCheckError("MathArray::ApplyFunctionInPlace(TArray & a..) Not Allocated Array a !"); T * pe; uint_8 j,k; if (a.AvgStep() > 0) { // regularly spaced elements uint_8 step = a.AvgStep(); uint_8 maxx = a.Size()*step; pe = a.Data(); for(k=0; k TArray MathArray::ApplyFunction(TArray const & a, Arr_DoubleFunctionOfX f) { TArray ra; ra = a; ApplyFunctionInPlace(ra, f); return(ra); } //! Apply Function (function float version) /*! \param a : argument array of the function \param f : function for replacement \return Return a new array filled with function f(a(i,j)) */ template TArray MathArray::ApplyFunction(TArray const & a, Arr_FloatFunctionOfX f) { TArray ra; ra = a; ApplyFunctionInPlace(ra, f); return(ra); } //! Compute \b mean and \b sigma of elements of array \b a, return \b mean template double MathArray::MeanSigma(TArray const & a, double & mean, double & sig) { if (a.NbDimensions() < 1) throw RangeCheckError("MathArray::MeanSigma(TArray const & a..) Not Allocated Array a !"); const T * pe; uint_8 j,k; mean=0.; sig = 0.; double valok; if (a.AvgStep() > 0) { // regularly spaced elements uint_8 step = a.AvgStep(); uint_8 maxx = a.Size()*step; pe = a.Data(); for(k=0; k= 0.) sig = std::sqrt(sig); #else // va comprendre pourquoi g++ veut ca pour faire la generation // de template !!!! if (sig >= 0.) sig = _Sqrt_(sig); #endif return(mean); } /////////////////////////////////////////////////////////////// #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template MathArray #pragma define_template MathArray #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class MathArray; template class MathArray; #endif