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

📄 function.cpp

📁 vc++ study
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 *
 * 参数:
 *   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 + -