⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algorithm.h

📁 模式识别二维链表实现isodata算法 早期试验
💻 H
字号:
// Algorithm.h: interface for the CAlgorithm class.
/////////////////////////////////////////////////////////////////////
//                算法的头文件                    ///////////////////
//////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////
////////            模式结构               /////////////////////
////////////////////////////////////////////////////////////////

 struct PATTERN_S
	{
		double *pat;//模式数组指针
		PATTERN_S *pNext;//下一个模式结构指针

	};

//////////////////////////////////////////////////////////////////
////////               类结构               //////////////////////
//////////////////////////////////////////////////////////////////
 struct CLUSTER_S 
	{
		PATTERN_S *pPat;//模式链指针
		double *pCenter;//类心指针
		double MaxBiaozhuncha;//类内距离的标准差矢量最大值
		int MaxBiaozhunchaPos;//类内距离的标准差矢量最大值位置
		double PatCentMeanDis;//模式到类心的平均距离
		bool CombineOrNot;//表示是否在一个循环内被合并过
		CLUSTER_S *pNext;//下一个类结构指针
	};


	
////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////
class CAlgorithm  
{
public:
	CAlgorithm();
	virtual ~CAlgorithm();

/////////////////////////////////////////////////////////////////////
//                           数据类型定义                          //
/////////////////////////////////////////////////////////////////////

	PATTERN_S *pPattern;//模式结构指针
	CLUSTER_S * pCluster;//类结构指针
	
	double c;//预期的类数
	int Nc;//初始聚类中心个数
	double Thn;//每一类中允许的最小模式数目
	double Ths;//类内各个分量分布的标准差上限
	double ThD;//两类中心之间的最小距离下限
	int L;//在每次迭代中可以合并的类的最多对数
	int I;//允许的最多迭代次数
	int Ip;//实际迭代的次数

	int PatNum;//模式的个数
	int PatDim;//模式的维数

	int UnClusPatNum;//未归类的模式的个数
	int ClusNum;//当前类的个数

	double TotalMeanDis;//各个模式到其类中心的总体平均距离
	double k;//类分裂时用的系数k





public :
////////////////////////////////////////////////////////////////////////////
//                                  数据的计算                            //
 ///////////////////////////////////////////////////////////////////////////
	int CalClusCent(CLUSTER_S *c);//计算更新类中心
	int CalPatCentMeanDis(CLUSTER_S *c);//计算更新各类中模式到类心的平均距离


	int Random(int max);//返回一个1-max之间的随机数

	double CalPatClusCentDis(PATTERN_S *p,CLUSTER_S *c);//计算模式与类之间的距离
	int CalClusMaxBiaozhuncha(CLUSTER_S *c);//计算类内距离的标准差矢量的最大值
	double CalTotalMeanDis();//计算各个模式到其类内中心的总体平均距离
	double CalClusCentDis(int posc1,int posc2);//根据位置计算两个类心之间的距离


////////////////////////////////////////////////////////////////////////////////
//                            用于测试的函数                                  // 
////////////////////////////////////////////////////////////////////////////////


	int DisplayInfo();//显示当前模式与类的信息
	int DisplayPattern(PATTERN_S *p);//显示模式信息
	int DisplayCluster(CLUSTER_S *c);//显示类中信息
	int PatternOutput();//显示模式数据
	int PatternInput();//读入模式数据
	int ParaSet();//参数设置
	int PatternFromArray(double input[]);//把数组转换为模式链结构
	int MemoryFree();//释放内存


/////////////////////////////////////////////////////////////////////////////////
//         节点的操作,用于类和模式链表的关系操作                            /////
////////////////////////////////////////////////////////////////////////////////


	CLUSTER_S* GetClusPointer(int position);//根据位置参数返回类结构指针
	PATTERN_S* SelectPattern(int position);//根据位置参数选出一个模式并返回模式结构指针


	int CountPattern(PATTERN_S *p);//返回模式结构链的长度
	int FreePatInClus(PATTERN_S *p);//释放已聚类的模式


	int AddNullCluster();//添加一个空类
	int AddCluster(CLUSTER_S *p);//添加一个类
	int DeleteCluster(int position);//删除一个类

	int AddPatToClus(PATTERN_S *p,CLUSTER_S *c);//将一个模式加入一个类节点

	int CombineCluster(int posc1, int posc2);//根据位置参数合并两个类
	int SeperateCluster(CLUSTER_S *c);//将一个类分裂
	
////////////////////////////////////////////////////////////////////////////////
//                    iso-data算法的步骤                                     //
////////////////////////////////////////////////////////////////////////////////

	int Step1();//参数设置、模式输入、随机产生初始分类
	int Step2();//根据模式与每个类之间的距离,将其加入距离最小的一个类
	int Step3();//如果类太小,合并并返回第二步
	int Step4();//计算类心、模式类心平均距离
	int Step5();//根据类的数量判断是交分裂处理还是交给合并处理
	int Step6_7();//计算类内距离的标准差矢量的最大值
	int Step8();//根据类内距离的标准差矢量的最大值判断是否分裂并分裂
	int Step9_10();//根据类心间距离判断是否合并并合并
	int Step11();//判断是否继续迭代或结束

////////////////////////////////////////////////////////////////////////////////
//                 iso-data算法的全程函数                                    //
////////////////////////////////////////////////////////////////////////////////
	void Test();
	void Process();


};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -