📄 function.cpp
字号:
// *****************************************************************************
// 文件名: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 + -