📄 mat_tools.h
字号:
x = m_Points_R[iRadius][iPoint].x;
y = m_Points_R[iRadius][iPoint].y;
return( m_Points_R[iRadius][iPoint].d ); // Distance...
}
return( -1.0 );
}
double Get_Point (int iRadius, int iPoint, int xOffset, int yOffset, int &x, int &y)
{
double d;
if( (d = Get_Point(iRadius, iPoint, x, y)) >= 0.0 )
{
x += xOffset;
y += yOffset;
}
return( d );
}
private:
int m_maxRadius, m_nPoints, *m_nPoints_R;
typedef struct
{
int x, y;
double d;
}
TSG_Grid_Radius;
TSG_Grid_Radius *m_Points, **m_Points_R;
};
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Spline
{
public:
CSG_Spline(void);
virtual ~CSG_Spline(void);
void Destroy (void);
bool Create (double *xValues, double *yValues, int nValues, double yA = 1.0e30, double yB = 1.0e30);
bool Create (double yA = 1.0e30, double yB = 1.0e30);
void Add (double x, double y);
double Get_xMin (void) { return( m_nValues > 0 ? m_Values[0 ].x : 0.0 ); }
double Get_xMax (void) { return( m_nValues > 0 ? m_Values[m_nValues - 1].x : 0.0 ); }
bool Get_Value (double x, double &y);
double Get_Value (double x);
protected:
bool m_bCreated;
int m_nValues, m_nBuffer;
TSG_Point_3D *m_Values;
bool _Create (double yA, double yB);
};
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
typedef enum ESG_Regression_Type
{
REGRESSION_Linear = 0, // Y = a + b * X
REGRESSION_Rez_X, // Y = a + b / X
REGRESSION_Rez_Y, // Y = a / (b - X)
REGRESSION_Pow, // Y = a * X^b
REGRESSION_Exp, // Y = a * e^(b * X)
REGRESSION_Log // Y = a + b * ln(X)
}
TSG_Regression_Type;
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Regression
{
public:
CSG_Regression(void);
virtual ~CSG_Regression(void);
void Destroy (void);
void Set_Values (int nValues, double *x, double *y);
void Add_Values (double x, double y);
int Get_Count (void) { return( m_nValues ); }
double Get_xValue (int iValue) { return( iValue >= 0 && iValue < m_nValues ? m_x[iValue] : 0.0 ); }
double Get_yValue (int iValue) { return( iValue >= 0 && iValue < m_nValues ? m_y[iValue] : 0.0 ); }
bool Get_Values (int iValue, double &x, double &y)
{
if( iValue >= 0 && iValue < m_nValues )
{
x = m_x[iValue];
y = m_y[iValue];
return( true );
}
return( false );
}
double Get_xMin (void) { return( m_xMin ); }
double Get_xMax (void) { return( m_xMax ); }
double Get_xMean (void) { return( m_xMean ); }
double Get_xVariance (void) { return( m_xVar ); }
double Get_x (double y); // returns INF on error, this can be checked using the _finite() function (libc, include <float.h>)...
double Get_yMin (void) { return( m_yMin ); }
double Get_yMax (void) { return( m_yMax ); }
double Get_yMean (void) { return( m_yMean ); }
double Get_yVariance (void) { return( m_yVar ); }
double Get_y (double x); // returns INF on error, this can be checked using the _finite() function (libc, include <float.h>)...
double Get_Constant (void) { return( m_RConst ); }
double Get_Coefficient (void) { return( m_RCoeff ); }
double Get_R (void) { return( m_R ); }
double Get_R2 (void) { return( m_R*m_R ); }
const SG_Char * asString (void);
TSG_Regression_Type Get_Type (void) { return( m_Type ); }
bool Calculate (TSG_Regression_Type Type = REGRESSION_Linear);
bool Calculate (int nValues, double *x, double *y, TSG_Regression_Type Type = REGRESSION_Linear);
protected:
int m_nValues, m_nBuffer;
double m_RConst, m_RCoeff, m_R,
m_xMin, m_xMax, m_xMean, m_xVar, *m_x,
m_yMin, m_yMax, m_yMean, m_yVar, *m_y;
TSG_Regression_Type m_Type;
bool _Get_MinMeanMax (double &xMin, double &xMean, double &xMax, double &yMin, double &yMean, double &yMax);
double _Y_Transform (double x);
double _X_Transform (double y);
bool _Linear (void);
};
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Regression_Multiple
{
public:
CSG_Regression_Multiple(void);
virtual ~CSG_Regression_Multiple(void);
void Destroy (void);
bool Calculate (const class CSG_Table &Values);
class CSG_Table * Get_Result (void) { return( m_pResult ); }
int Get_Ordered (int iOrder);
int Get_Order (int iVariable);
double Get_R2 (int iVariable);
double Get_R2_Change (int iVariable);
double Get_RConst (void);
double Get_RCoeff (int iVariable);
protected:
class CSG_Table *m_pResult;
bool _Get_Regression (const class CSG_Table &Values);
bool _Get_Correlation (const class CSG_Table &Values);
bool _Get_Correlation (int nValues, int nVariables, double **X, double *Y, int &iMax, double &rMax);
bool _Eliminate (int nValues, double *X, double *Y);
};
///////////////////////////////////////////////////////////
// //
// Formula Parser (A. Ringeler) //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
typedef double (*TSG_PFNC_Formula_0)(void);
typedef double (*TSG_PFNC_Formula_1)(double);
typedef double (*TSG_PFNC_Formula_2)(double, double);
typedef double (*TSG_PFNC_Formula_3)(double, double, double);
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Formula
{
public:
CSG_Formula(void);
static CSG_String Get_Help_Operators (void);
static CSG_String Get_Help_Usage (void);
bool Get_Error (int *Pos = NULL, const SG_Char **Msg = NULL);
double Val(double *Vals, int n);
double Val(void);
double Val(SG_Char *Args, ...);
double Val(double x);
void Set_Variable(SG_Char Variable, double Value);
bool Set_Formula(const SG_Char *Formula);
CSG_String Get_Formula(void) { return( m_Formula ); }
int Del_Function(SG_Char *Name);
int Add_Function(SG_Char *Name, TSG_PFNC_Formula_1 f, int N_of_Pars, int Varying);
const SG_Char * Get_Used_Var(void);
//-----------------------------------------------------
typedef struct
{
SG_Char *name;
TSG_PFNC_Formula_1 f;
int n_pars;
int varying; // Does the result of the function vary even when the parameters stay the same? varying = 1 for e.g. random - number generators.
}
TSG_Formula_Item;
private:
//-----------------------------------------------------
typedef struct
{
SG_Char *code;
double *ctable;
}
TMAT_Formula;
//-----------------------------------------------------
CSG_String m_Formula;
const SG_Char *i_error;
bool used_vars[256]; //['z' - 'a' + 1];
const SG_Char *errmes;
int i_pctable; // number of items in a table of constants - used only by the translating functions
int Error_Pos;
int Length;
double *i_ctable; // current table of constants - used only by the translating functions
double param[256]; //['z' - 'a' + 1];
TMAT_Formula function;
TMAT_Formula translate(const SG_Char *source, const SG_Char *args, int *length, int *error);
int fnot_empty(TMAT_Formula);
double grid_value(TMAT_Formula func);
void destrf(TMAT_Formula);
void make_empty(TMAT_Formula);
const SG_Char * fget_error(void);
int read_table(int i, SG_Char *name, int *n_pars, int *varying);
int where_table(SG_Char *name);
void fset_error(const SG_Char *s);
double value(TMAT_Formula func);
int max_size(const SG_Char *source);
SG_Char * my_strtok(SG_Char *s);
SG_Char * i_trans(SG_Char *function, SG_Char *begin, SG_Char *end);
SG_Char * comp_time(SG_Char *function, SG_Char *fend, int npars);
int isoper(SG_Char c);
int is_code_oper(SG_Char c);
int isin_real(SG_Char c);
};
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Trend
{
public:
CSG_Trend(void);
virtual ~CSG_Trend(void);
bool Set_Formula (const SG_Char *Formula = NULL);
CSG_String Get_Formula (void);
int Get_Parameter_Count (void) const { return( m_Params.m_Count ); }
double * Get_Parameters (void) const { return( m_Params.m_A ); }
void Clr_Data (void);
void Set_Data (double *xData, double *yData, int nData, bool bAdd = false);
void Set_Data (const CSG_Points &Data, bool bAdd = false);
void Add_Data (double x, double y);
int Get_Data_Count (void) const { return( m_Data.Get_Count() ); }
double Get_Data_X (int Index) { return( m_Data.Get_X(Index) ); }
double Get_Data_Y (int Index) { return( m_Data.Get_Y(Index) ); }
bool Set_Max_Iterations (int Iterations);
int Get_Max_Iterations (void) { return( m_Iter_Max); }
bool Set_Max_Lambda (double Lambda);
double Get_Max_Lambda (void) { return( m_Lambda_Max); }
bool Get_Trend (double *xData, double *yData, int nData, const SG_Char *Formula = NULL);
bool Get_Trend (const CSG_Points &Data, const SG_Char *Formula = NULL);
bool Get_Trend (void);
bool is_Okay (void) { return( m_bOkay ); }
CSG_String Get_Error (void);
double Get_ChiSquare (void);
double Get_R2 (void);
double Get_Value (double x);
private:
//-----------------------------------------------------
class SAGA_API_DLL_EXPORT CFncParams
{
public:
CFncParams(void);
virtual ~CFncParams(void);
bool Create (const SG_Char *Variables, int nVariables);
bool Destroy (void);
int m_Count;
SG_Char *m_Variables;
double *m_A, *m_Atry, *m_dA, *m_dA2, *m_Beta, **m_Alpha, **m_Covar;
};
//-----------------------------------------------------
bool m_bOkay;
int m_Iter_Max;
double m_ChiSqr, m_ChiSqr_o, m_Lambda, m_Lambda_Max;
CSG_Points m_Data;
CFncParams m_Params;
CSG_Formula m_Formula;
bool _Fit_Function (void);
bool _Get_Gaussj (void);
bool _Get_mrqcof (double *Parameters, double **Alpha, double *Beta);
void _Get_Function (double x, double *Parameters, double &y, double *dy_da);
};
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#endif // #ifndef HEADER_INCLUDED__SAGA_API__mat_tools_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -