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

📄 function.cpp

📁 vc++ study
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// *****************************************************************************
//  文件名:Function.cpp
//
//  Classify()                            - 分类
//  CancelPatternCenter()                 - 取消聚类中心
//  CalPatternCenter()                    - 计算类中心
//  CalAverDisFromPaToCen()               - 计算各类中模式到类心的平均距离
//  CalWholeAverDisFromPaToCen()          - 计算各个模式到其类心的总体平均距离
//  CalDistancePatternAndCenter()         - 计算一个模式与聚类中心的距离
//  CalStandardDeviationMax()             - 计算各类类内距离的标准矢量的最大分量
//  CalSortAndUniteDisPaCenter()          - 计算、排序各类对中心的距离,并合并聚类中心
//
// ******************************************************************************
#include "stdafx.h"
#include "Function.h"


/********************************************************************************
 *
 * 函数名称:
 *   Classify()
 *
 * 参数:
 *   CObList * pPatternAllList           - 所有模式集合
 *   CObList * pPatternCenterList        - 模式聚类中心集合
 *   int PatternTotalMount               - 模式总数
 *   int PatternCenterMount              - 模式中心数量
 *   int PatternDemension                - 模式维数
 *   
 * 返回值:
 *   VOID               
 *
 * 说明:
 *   该函数用来对模式进行分类。
 * 
 ************************************************************************/
void Classify(CObList * pPatternAllList,CObList * pPatternCenterList,int PatternTotalMount,int PatternCenterMount,int PatternDemension)
{
	int i,j;
	double distance1,distance2=0;
	int iFlag;
	CPattern * ptemp1;
	CPatternCenter * ptemp2;
	POSITION pos;
	//先将中心的类别数清零
	for (i=1;i<=PatternCenterMount;i++)
	{
		pos = pPatternCenterList->FindIndex(i-1);
		ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
		ptemp2->PatternMount = 0;
	}

	for (i=1;i<=PatternTotalMount;i++)
	{
		pos = pPatternAllList->FindIndex(i-1);
		ptemp1 = (CPattern *)pPatternAllList->GetAt(pos);
		for (j=1;j<=PatternCenterMount;j++)
		{
			pos = pPatternCenterList->FindIndex(j-1);
			ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
			distance1 = CalDistancePatternAndCenter(ptemp1,ptemp2,PatternDemension);
			if((distance2 > distance1) || (j == 1))
			{
				distance2 = distance1;
				iFlag = j;
			}
		}
		ptemp1->WhichCenter = iFlag;
		pos = pPatternCenterList->FindIndex(iFlag - 1);
		ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
		ptemp2->PatternMount = ptemp2->PatternMount + 1;

	}

}


/********************************************************************************
 *
 * 函数名称:
 *   CalDistancePatternAndCenter()
 *
 * 参数:
 *   CPattern * pAnyPattern                    - 某一个模式
 *   CPatternCenter * pAnyPatternCenter        - 某一个聚类中心
 *   int PatternDemension                      - 模式维数
 *   
 * 返回值:
 *   double distance - 返回值为距离               
 *
 * 说明:
 *   该函数用来计算某一个模式到聚类中心的距离。
 * 
 ************************************************************************/
double CalDistancePatternAndCenter(CPattern * pAnyPattern,CPatternCenter * pAnyPatternCenter,int PatternDemension)
{
	
	double distance = 0;
	int i;
	struct PatternElement * ptemp1 = pAnyPattern->pPatternElementHead;
	struct PatternElement * ptemp2 = pAnyPatternCenter->pPatternElementHead;
	for (i=1;i<=PatternDemension;i++)
	{
		distance = distance + (fabs(ptemp1->Element - ptemp2->Element)) * (fabs(ptemp1->Element - ptemp2->Element));
		ptemp1 = ptemp1->next;
		ptemp2 = ptemp2->next;
	}

	distance = sqrt(distance);
	return distance;

}


/********************************************************************************
 *
 * 函数名称:
 *   CalDisFromCenToCen()
 *
 * 参数:
 *   CPatternCenter * pAnyPatternCenter1        - 某一个聚类中心
 *   CPatternCenter * pAnyPatternCenter2        - 某一个聚类中心
 *   int PatternDemension                       - 模式维数
 *   
 * 返回值:
 *   double distance - 返回值为距离               
 *
 * 说明:
 *   该函数用来计算某一聚类中心到另一聚类中心的距离。
 * 
 ************************************************************************/
double CalDisFromCenToCen(CPatternCenter * pAnyPatternCenter1,CPatternCenter * pAnyPatternCenter2,int PatternDemension)
{
	
	double distance = 0;
	int i;
	struct PatternElement * ptemp1 = pAnyPatternCenter1->pPatternElementHead;
	struct PatternElement * ptemp2 = pAnyPatternCenter2->pPatternElementHead;
	for (i=1;i<=PatternDemension;i++)
	{
		distance = distance + (fabs(ptemp1->Element - ptemp2->Element)) * (fabs(ptemp1->Element - ptemp2->Element));
		ptemp1 = ptemp1->next;
		ptemp2 = ptemp2->next;
	}

	distance = sqrt(distance);
	return distance;

}

/********************************************************************************
 *
 * 函数名称:
 *   CancelPatternCenter()
 *
 * 参数:
 *   CObList * pPatternCenterList      - 模式聚类中心集合
 *   int n                             - 待取消的聚类中心序号
 *   
 * 返回值:
 *   VOID               
 *
 * 说明:
 *   该函数用来从聚类中心集合中取消指定的聚类中心。
 * 
 ************************************************************************/
void CancelPatternCenter(CObList * pPatternCenterList,int n)
{
	POSITION pos;
	pos = pPatternCenterList->FindIndex(n-1);
	CPatternCenter * ptemp = (CPatternCenter *)pPatternCenterList->GetAt(pos);
	pPatternCenterList->RemoveAt(pos);
	delete ptemp;

}

/********************************************************************************
 *
 * 函数名称:
 *   CalPatternCenter()
 *
 * 参数:
 *   CObList * pPatternAllList           - 所有模式集合
 *   CObList * pPatternCenterList        - 模式聚类中心集合
 *   int PatternCenterMount              - 模式中心数量
 *   int PatternTotalMount               - 模式总数
 *   int PatternDemension                - 模式维数
 *   
 * 返回值:
 *   VOID               
 *
 * 说明:
 *   该函数用来根据每类中的所有模式计算聚类中心。
 * 
 ************************************************************************/
void CalPatternCenter(CObList * pPatternAllList,CObList * pPatternCenterList,int PatternCenterMount,int PatternTotalMount,int PatternDemension)
{
	int i,j,i1,i2,i3;
	CPattern * ptemp1;
	CPatternCenter * ptemp2;
	POSITION pos;
	struct PatternElement * ptemp3;
	struct PatternElement * ptemp4;

	//将聚类中心清零
	for (i=1;i<=PatternCenterMount;i++)
	{
		pos = pPatternCenterList->FindIndex(i-1);
		ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
		ptemp3 = ptemp2->pPatternElementHead;
		for (j=1;j<=PatternDemension;j++)
		{
			ptemp3->Element = 0;
			ptemp3 = ptemp3->next;
		}
	}
			


	for (i1=1;i1<=PatternCenterMount;i1++)
	{
		pos = pPatternCenterList->FindIndex(i1-1);
		ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
		for(i2=1;i2<=PatternTotalMount;i2++)
		{
			ptemp3 = ptemp2->pPatternElementHead;
			pos = pPatternAllList->FindIndex(i2-1);
	    	ptemp1 = (CPattern *)pPatternAllList->GetAt(pos);
			if (ptemp1->WhichCenter == i1)
			{
				ptemp4 = ptemp1->pPatternElementHead;
				for (i3=1;i3<=PatternDemension;i3++)
				{
					ptemp3->Element = ptemp3->Element + ptemp4->Element;
					ptemp3 = ptemp3->next;
					ptemp4 = ptemp4->next;
				}
			}
		}
	}

	for (i=1;i<=PatternCenterMount;i++)
	{
		pos = pPatternCenterList->FindIndex(i-1);
		ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
		ptemp3 = ptemp2->pPatternElementHead;
		for (j=1;j<=PatternDemension;j++)
		{
			ptemp3->Element = ptemp3->Element/(ptemp2->PatternMount);
			ptemp3 = ptemp3->next;
		}
	}

}


/********************************************************************************
 *
 * 函数名称:
 *   CalAverDisFromPaToCen()

⌨️ 快捷键说明

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