📄 function.cpp
字号:
*
* 参数:
* CObList * pPatternAllList - 所有模式集合
* CObList * pPatternCenterList - 模式聚类中心集合
* int PatternCenterMount - 模式中心数量
* int PatternTotalMount - 模式总数
* int PatternDemension - 模式维数
*
* 返回值:
* VOID
*
* 说明:
* 该函数用来计算各类中模式到类心的平均距离。
*
************************************************************************/
void CalAverDisFromPaToCen(CObList * pPatternAllList,CObList * pPatternCenterList,int PatternCenterMount,int PatternTotalMount,int PatternDemension)
{
int i,i1,i2;
CPattern * ptemp1;
CPatternCenter * ptemp2;
POSITION pos;
//将聚类中心中变量AverageDistanceFromPatternToCenter清零
for (i=1;i<=PatternCenterMount;i++)
{
pos = pPatternCenterList->FindIndex(i-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
ptemp2->AverageDistanceFromPatternToCenter=0;
}
//将类中模式到其中心的距离累积到聚类中心变量AverageDistanceFromPatternToCenter中
for (i1=1;i1<=PatternCenterMount;i1++)
{
pos = pPatternCenterList->FindIndex(i1-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
for(i2=1;i2<=PatternTotalMount;i2++)
{
pos = pPatternAllList->FindIndex(i2-1);
ptemp1 = (CPattern *)pPatternAllList->GetAt(pos);
if (ptemp1->WhichCenter == i1)
{
ptemp2->AverageDistanceFromPatternToCenter = ptemp2->AverageDistanceFromPatternToCenter + CalDistancePatternAndCenter(ptemp1,ptemp2,PatternDemension);
}
}
}
//将每类总的距离平均得到平均距离
for (i=1;i<=PatternCenterMount;i++)
{
pos = pPatternCenterList->FindIndex(i-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
ptemp2->AverageDistanceFromPatternToCenter = (ptemp2->AverageDistanceFromPatternToCenter)/(ptemp2->PatternMount);
}
}
/********************************************************************************
*
* 函数名称:
* CalWholeAverDisFromPaToCen()
*
* 参数:
* CObList * pPatternCenterList - 模式聚类中心集合
* int PatternCenterMount - 模式中心数量
* int PatternTotalMount - 模式总数
*
* 返回值:
* DOUBLE - 返回总体平均距离
*
* 说明:
* 该函数用来计算各个模式到其类心的总体平均距离。
*
************************************************************************/
double CalWholeAverDisFromPaToCen(CObList * pPatternCenterList,int PatternCenterMount,int PatternTotalMount)
{
int i;
double distance = 0;
CPatternCenter * ptemp;
POSITION pos;
for (i=0;i<=PatternCenterMount;i++)
{
pos = pPatternCenterList->FindIndex(i-1);
ptemp = (CPatternCenter *)pPatternCenterList->GetAt(pos);
distance = distance + ptemp->AverageDistanceFromPatternToCenter * ptemp->PatternMount;
}
distance = distance/PatternTotalMount;
return distance;
}
/********************************************************************************
*
* 函数名称:
* CalStandardDeviationMax()
*
* 参数:
* CObList * pPatternAllList - 所有模式集合
* CObList * pPatternCenterList - 模式聚类中心集合
* int PatternDemension - 模式维数
* int PatternCenterMount - 模式中心数量
* int PatternTotalMount - 模式总数
*
* 返回值:
* VOID
*
* 说明:
* 该函数用来计算各类类内距离的标准矢量的最大分量。
*
************************************************************************/
void CalStandardDeviationMax(CObList * pPatternAllList,CObList * pPatternCenterList,int PatternDemension,int PatternCenterMount,int PatternTotalMount)
{
int i,j,k,l,iFlag;
CPattern * ptemp1;
CPatternCenter * ptemp2;
POSITION pos;
double dtemp;
struct PatternElement * ptemp3;
struct PatternElement * ptemp4;
for (i=1;i<=PatternCenterMount;i++)
{
pos = pPatternCenterList->FindIndex(i-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
ptemp2->StandardDeviationMax = 0;
ptemp2->FlagStaDevMax = 0;
}
for (i=1;i<=PatternCenterMount;i++)
{
iFlag = 0;
pos = pPatternCenterList->FindIndex(i-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
ptemp4 = ptemp2->pPatternElementHead;
for(j=1;j<=PatternDemension;j++)
{
dtemp = 0;
for (k=1;k<=PatternTotalMount;k++)
{
pos = pPatternAllList->FindIndex(k-1);
ptemp1 = (CPattern *)pPatternAllList->GetAt(pos);
if (ptemp1->WhichCenter==i)
{
ptemp3 = ptemp1->pPatternElementHead;
for (l=1;l<j;l++)
{
ptemp3 = ptemp3->next;
}
dtemp = dtemp + fabs(ptemp3->Element - ptemp4->Element) * fabs(ptemp3->Element - ptemp4->Element);
}
}
if (ptemp2->StandardDeviationMax<dtemp)
{
ptemp2->StandardDeviationMax = dtemp;
iFlag = j;
}
ptemp4 = ptemp4->next;
}
ptemp2->StandardDeviationMax = sqrt(ptemp2->StandardDeviationMax/ptemp2->PatternMount);
ptemp2->FlagStaDevMax = iFlag;
}
}
/********************************************************************************
*
* 函数名称:
* CalSortDisPaCenter()
*
* 参数:
* CObList * pPatternCenterList - 模式聚类中心集合
* CObList * pCenterDistanceList - 模式中心距离集合
* int MaxUniteMount - 在每次迭代中可以合并的类的最多对数
* double MinDisPatCen - 两类中心间的最小距离下限
* int PatternCenterMount - 模式中心数量
* int PatternDemension - 模式维数
*
* 返回值:
* BOOL
*
* 说明:
* 该函数用来计算计算、排序各类对中心的距离。
*
************************************************************************/
void CalSortDisPaCenter(CObList * pPatternCenterList,CObList * pCenterDistanceList,int MaxUniteMount,double MinDisPatCen,int PatternCenterMount,int PatternDemension)
{
CObList CenterDistanceList;
//计算各类对中心间的距离
POSITION pos;
CPatternCenter * ptemp1,* ptemp2;
int i,j;
CCenterDistance * pCenterDistance;
double dDis;
for (i=1;i<PatternCenterMount;i++)
{
for(j=i+1;j<=PatternCenterMount;j++)
{
pos = pPatternCenterList->FindIndex(i-1);
ptemp1 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
pos = pPatternCenterList->FindIndex(j-1);
ptemp2 = (CPatternCenter *)pPatternCenterList->GetAt(pos);
dDis = CalDisFromCenToCen(ptemp1,ptemp2,PatternDemension);
pCenterDistance = new CCenterDistance;
pCenterDistance->distance = dDis;
pCenterDistance->Center1 = i;
pCenterDistance->Center2 = j;
CenterDistanceList.AddTail(pCenterDistance);
}
}
//将类对中的距离按从小到大排序并取出前MaxUniteMount项
int count,iFlag;
for (i=1;i<=MaxUniteMount;i++)
{
count = CenterDistanceList.GetCount();
pos = CenterDistanceList.FindIndex(i-1);
pCenterDistance = (CCenterDistance *)CenterDistanceList.GetAt(pos);
dDis = pCenterDistance->distance;
iFlag = 1;
for (j=2;j<=count;j++)
{
pos = CenterDistanceList.FindIndex(j-1);
pCenterDistance = (CCenterDistance *)CenterDistanceList.GetAt(pos);
if (dDis > pCenterDistance->distance)
{
dDis = pCenterDistance->distance;
iFlag = j;
}
}
pos = CenterDistanceList.FindIndex(iFlag-1);
pCenterDistance = (CCenterDistance *)CenterDistanceList.GetAt(pos);
pCenterDistanceList->AddTail(pCenterDistance);
//CenterDistanceList.RemoveAt(pos);
}
//整理排序后的各类对中心间的距离
for (i=1;i<=MaxUniteMount;i++)
{
pos = pCenterDistanceList->FindIndex(i-1);
pCenterDistance = (CCenterDistance *)pCenterDistanceList->GetAt(pos);
if (pCenterDistance->distance > MinDisPatCen)
{
pCenterDistanceList->RemoveAt(pos);
delete pCenterDistance;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -