计算 变异系数 标准差 标准偏差 相关系数 平滑指数 回归系数等C++ 模板类
2016-07-20 13:44
507 查看
#include <math.h> #define MINZERO (0.0000001) class CCalculate { public: CCalculate(); virtual ~CCalculate(); //获取最大值 template<class T> static T GetMax( T* x,int nLen) { T Temp,Max; Max = *x; for (int i=0; i<nLen;i++) { Temp = *(x+i); if (Temp >= Max) { Max = Temp; } } return Max; } //获取最大值序号 从0开始计算 template<class T> static int GetMaxNum( T* x,int nLen) { T Temp,Max; Max = *x; int n = 0; for (int i=0; i<nLen;i++) { Temp = *(x+i); if (Temp >= Max) { Max = Temp; n = i; } } return n; } //获取最小值 template<class T> static T GetMin( T* x,int nLen) { T Temp,Min; Min = *x; for (int i=0;i<nLen;i++) { Temp = *(x+i); if(Temp <= Min) { Min = Temp; } } return Min; } //获取最小值序号 从0开始计算 template<class T> static int GetMinNum( T* x,int nLen) { T Temp,Min; Min = *x; int n = 0; for (int i=0;i<nLen;i++) { Temp = *(x+i); if(Temp <= Min) { Min = Temp; n = i; } } return n; } //获取平均值 template<class T> static double GetAve( T* x,int nLen) { double sum = 0.00; double Ave = 0.00; for (int i=0;i<nLen;i++) { sum += (double)*(x+i); } Ave = sum/nLen; return Ave; } //获取标准差=标准偏差 template<class T> static double GetSD( T* x,int nLen) { if (nLen <= 0) { return -1; } double sum = 0.00; double Ave = 0.00; Ave = GetAve(x,nLen); for (int i=0; i< nLen; ++i) { sum += (*(x+i)-Ave)*(*(x+i)-Ave); } double SD = sqrt((sum/nLen)); return SD; } //获取标准误差SE template<class T> static double GetSE(IN T* x, IN int nLen) { double SD = 0.00; SD = GetSD(x,nLen); double SE = double(SD/sqrt((double)nLen)); return SE; } //获取变异系数CV template<class T> static BOOL GetCV(IN T* x, IN int nLen, OUT double& CV) { double Ave = 0.00; double SD = 0.00; Ave = GetAve(x,nLen); if(Ave < MINZERO && Ave > -MINZERO) { return FALSE; } SD = GetSD(x,nLen); CV = SD/(double)Ave; return TRUE; } //获取平滑指数SI:Smooth Index template<class T> static BOOL GetSI(IN T* x, IN int nLen,OUT double& SI) { double CV = 0.00; if(!GetCV(x, nLen,CV)) { return FALSE; } if (CV < MINZERO && CV > -MINZERO) { return FALSE; } SI = 1.00/CV; return TRUE; } //获取大于thres的数据的百分比 template<class T> static double GetUpPercent(T* x, int nLen, T thres) { double dPer = 0.00; int nCount = 0; for (int i=0;i<nLen;i++) { if(*(x+i) > thres) { nCount++; } } dPer = ((double)nCount)/nLen; return dPer; } //获取大于thres的数据的个数 template<class T> static int GetUpNum(T* x, int nLen, T thres) { int nCount = 0; for (int i=0;i<nLen;i++) { if(*(x+i) > thres) { nCount++; } } return nCount; } //获取小于thres的数据的百分比 template<class T> static double GetDownPercent(T* x, int nLen, T thres) { double dPer = 0.00; int nCount = 0; for (int i=0;i<nLen;i++) { if(*(x+i) < thres) { nCount++; } } dPer = ((double)nCount)/nLen; return dPer; } //获取小于thres的数据的个数 template<class T> static int GetDownNum(T* x, int nLen, T thres) { int nCount = 0; for (int i=0;i<nLen;i++) { if(*(x+i) < thres) { nCount++; } } return nCount; } //获取两组数据的相关系数,无前后关系 template<class T> static BOOL GetCorrCoef(IN T* x,IN T* y,IN int nLen,OUT double& r) { double xAve = GetAve(x,nLen); double yAve = GetAve(y,nLen); double Sum = 0.00; double xSum2 = 0.00; double ySum2 = 0.00; for (int i=0;i<nLen;i++) { Sum += (*(x+i)-xAve)*(*(y+i)-yAve); xSum2 += (*(x+i)-xAve)*(*(x+i)-xAve); ySum2 += (*(y+i)-yAve)*(*(y+i)-yAve); } double res = sqrt(xSum2*ySum2); if (res < MINZERO && res > -MINZERO) { return FALSE; } r = Sum/res; return TRUE; } //获取两组数据的回归系数,有前后关系 x自变量,y因变量 b斜率 a截距 template<class T> static BOOL GetRegressCoef(IN T* x,IN T* y,IN int nLen,OUT double& b,OUT double& a) { double xAve = GetAve(x,nLen); double yAve = GetAve(y,nLen); double Sum = 0.00; double xSum2 = 0.00; for (int i=0;i<nLen;i++) { Sum += (*(x+i)-xAve)*(*(y+i)-yAve); xSum2 += (*(x+i)-xAve)*(*(x+i)-xAve); } if (xSum2 < MINZERO && xSum2 > -MINZERO) { return FALSE; } b = Sum/xSum2; a = yAve - xAve*b; return TRUE; } };
CCalculate::CCalculate() { } CCalculate::~CCalculate() { }
相关文章推荐
- Visual C++中MFC消息的分类
- MFC中Radio Button的用法详解
- MFC对话框中添加状态栏的方法
- MFC创建右键弹出菜单的方法
- MFC中动态创建控件以及事件响应实现方法
- C++ 关于MFC多线程编程的注意事项
- MFC程序对文件的处理方法
- MFC自定义消息的实现方法
- MFC实现在文件尾追加数据的方法
- MFC之ComboBox控件用法实例教程
- MFC绘制不规则窗体的方法
- IE8引发 VS2005/2008 MFC向导出错的解决方案
- MFC实现全屏功能代码实例
- 使用VS2010创建MFC ActiveX工程项目
- C++中MFC Tab Control控件的使用详解
- MFC程序设计常用技巧汇总
- MFC扩展DLL中导出类和对话框的实现方法
- VC中SDK与MFC的区别浅析
- 浅谈MFC 改变控件大小和位置
- VC MFC非模态对话框的实现方法