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

📄 cluster.cpp

📁 用VISUALC++编写的聚类分析程序,图像识别.(各种算法),具有非常大的价值.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}
		else break;//退出循环
	}

}
/************************************************************
*函数名称		Zhongjianjulifa()
*参数			void
*返回值		    void
*函数功能		按照中间距离法对全体样品进行分类
*************************************************************/
void CCluster::Zhongjianjulifa()
{
	GetFeature();
	
	double	**centerdistance;//记录类间距离
	double  T;//阈值
	int		distype;//距离的形式(欧氏、余弦。。。)
	int     i,j;

	double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;

	minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
	maxous=0; maxcos=0; maxbcos=0; maxtan=0;
	//计算四种距离模式的参考值
	for (  i=0;i<patternnum-1;i++)
		for ( j=i+1;j<patternnum;j++)
		{
			if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
				minous=GetDistance(m_pattern[i],m_pattern[j],1);
			if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
				maxous=GetDistance(m_pattern[i],m_pattern[j],1);

			if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
				mincos=GetDistance(m_pattern[i],m_pattern[j],2);
			if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
				maxcos=GetDistance(m_pattern[i],m_pattern[j],2);

			if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
				minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
				maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			
			if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
				mintan=GetDistance(m_pattern[i],m_pattern[j],4);
			if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
				maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
		}
	DlgInfor mDlgInfor;
	mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);

	if (mDlgInfor.DoModal()==IDOK)
	{
		T=mDlgInfor.m_T;
		distype=mDlgInfor.m_DisType;
	}
	else return;

    //初始化
	for ( i=0;i<patternnum;i++)//每个样品自成一类
	{
		m_pattern[i].category=i+1;
	}

	centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
	for ( i=1;i<patternnum;i++)
	{
		centerdistance[i]=new double [patternnum+1];
	}

	for ( i=1;i<patternnum;i++)
		for (int j=i+1;j<=patternnum;j++)
		{
			centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
		}

	centernum=patternnum;
	
	while(1)
	{
		double td,**tempdistance;
		int ti,tj;
		td=MAX;
		ti=0;
		tj=0;

		tempdistance= new double *[patternnum];//临时记录类间距离
		for (i=1;i<patternnum;i++)
		{
			tempdistance[i]=new double[patternnum+1];
		}

		for( i=1;i<centernum;i++)//找到距离最近的两类:ti,tj,记录最小距离td;
			for ( j=i+1;j<=centernum;j++)
			{
				if (td>centerdistance[i][j])	
				{
					td=centerdistance[i][j];
					ti=i;tj=j;
				}
			}

		if(td<T)//合并类i,j
		{
			for ( i=0;i<patternnum;i++)
			{
				if (m_pattern[i].category==tj)
					m_pattern[i].category=ti;
				if (m_pattern[i].category>tj)
					m_pattern[i].category--;
			}
			centernum--;

			for (i=1;i<centernum;i++)//重新计算合并后的类到其他各类的新距离
				for ( j=i+1;j<=centernum;j++)
				{
					if (i<ti)
					{
						if(j==ti)
							tempdistance[i][j]=sqrt (centerdistance[i][ti]*centerdistance[i][ti]/2+centerdistance[i][tj]*centerdistance[i][tj]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
						else if (j>=tj)
							tempdistance[i][j]=centerdistance[i][j+1];
						else
							tempdistance[i][j]=centerdistance[i][j];
					
					}
					else if (i==ti)
					{
						if (j<tj)
							tempdistance[i][j]=sqrt (centerdistance[ti][j]*centerdistance[ti][j]/2+centerdistance[j][tj]*centerdistance[j][tj]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
                        else
							tempdistance[i][j]=sqrt (centerdistance[ti][j+1]*centerdistance[ti][j+1]/2+centerdistance[tj][j+1]*centerdistance[tj][j+1]/2-centerdistance[ti][tj]*centerdistance[ti][tj]/4);
					}
					else if((i>ti)&&(i<tj))
					{
						if(j<tj)
							tempdistance[i][j]=centerdistance[i][j];
						else
							tempdistance[i][j]=centerdistance[i][j+1];
					}
					else //i>=tj
					{
						tempdistance[i][j]=centerdistance[i+1][j+1];
					}
				}
			for (i=1;i<centernum;i++)
				for ( j=i+1;j<=centernum;j++)
				{
					centerdistance[i][j]=tempdistance[i][j];
				}

		}
		else break;
		delete []tempdistance;
	}
	delete []centerdistance;

}
/************************************************************
*函数名称		Zhongxinfa()
*参数			void
*返回值  		void
*函数功能		按照重心法对全体样品进行分类
************************************************************/
void CCluster::Zhongxinfa()
{
	GetFeature();
	
	double	**centerdistance;//记录类间距离
	double  T;//阈值
	int		distype;//距离的形式(欧氏、余弦。。。)
	int     i,j;
	double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;

	minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
	maxous=0; maxcos=0; maxbcos=0; maxtan=0;
	//计算四种距离模式的参考值
	for (  i=0;i<patternnum-1;i++)
		for ( j=i+1;j<patternnum;j++)
		{
			if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
				minous=GetDistance(m_pattern[i],m_pattern[j],1);
			if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
				maxous=GetDistance(m_pattern[i],m_pattern[j],1);

			if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
				mincos=GetDistance(m_pattern[i],m_pattern[j],2);
			if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
				maxcos=GetDistance(m_pattern[i],m_pattern[j],2);

			if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
				minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
				maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			
			if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
				mintan=GetDistance(m_pattern[i],m_pattern[j],4);
			if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
				maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
		}
	DlgInfor mDlgInfor;
	mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);

	if (mDlgInfor.DoModal()==IDOK)
	{
		T=mDlgInfor.m_T;
		distype=mDlgInfor.m_DisType;
	}
	else return;

    //初始化
	for ( i=0;i<patternnum;i++)//每个样品自成一类
	{
		m_pattern[i].category=i+1;
	}

	centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
	for ( i=1;i<patternnum;i++)
	{
		centerdistance[i]=new double [patternnum+1];
	}

	for ( i=1;i<patternnum;i++)
		for (int j=i+1;j<=patternnum;j++)
		{
			centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
		}

	centernum=patternnum;
	
	
    while(1)
	{
		double td,**tempdistance;
		int ti,tj;//距离最小的类
		int numi,numj;//i,j类中的元素个数

		td=MAX;
		ti=0;
		tj=0;
		numi=0;
		numj=0;
		tempdistance= new double *[patternnum];//临时记录类间距离
		for (i=1;i<patternnum;i++)
		{
			tempdistance[i]=new double[patternnum+1];
		}

		for( i=1;i<centernum;i++)//找到距离最近的两类:ti,tj,记录最小距离td;
			for ( j=i+1;j<=centernum;j++)
			{
				if (td>centerdistance[i][j])	
				{
					td=centerdistance[i][j];
					ti=i;tj=j;
				}
			}

		if(td<T)//最小距离小于阈值,合并类i,j
		{
			for (int i=0;i<patternnum;i++)
			{
				if (m_pattern[i].category==ti)
					numi++;
				if (m_pattern[i].category==tj)
				{
					m_pattern[i].category=ti;
					numj++;
				}
				if (m_pattern[i].category>tj)
					m_pattern[i].category--;
			}
			centernum--;
			//重新计算类间距离,保持类号的连续性
			for (i=1;i<centernum;i++)
				for (int j=i+1;j<=centernum;j++)
				{
					if (i<ti)
					{
						if(j==ti)
							tempdistance[i][j]=sqrt (centerdistance[i][ti]*centerdistance[i][ti]*numi/(numi+numj)+centerdistance[i][tj]*centerdistance[i][tj]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
						else if (j>=tj)
							tempdistance[i][j]=centerdistance[i][j+1];
						else
							tempdistance[i][j]=centerdistance[i][j];
					
					}
					else if (i==ti)
					{
						if (j<tj)
							tempdistance[i][j]=sqrt (centerdistance[ti][j]*centerdistance[ti][j]*numi/(numi+numj)+centerdistance[j][tj]*centerdistance[j][tj]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
                        else
							tempdistance[i][j]=sqrt (centerdistance[ti][j+1]*centerdistance[ti][j+1]*numi/(numi+numj)+centerdistance[tj][j+1]*centerdistance[tj][j+1]*numj/(numi+numj)-centerdistance[ti][tj]*centerdistance[ti][tj]*numi*numj/(numi+numj));
					}
					else if((i>ti)&&(i<tj))
					{
						if(j<tj)
							tempdistance[i][j]=centerdistance[i][j];
						else
							tempdistance[i][j]=centerdistance[i][j+1];
					}
					else //i>=tj
					{
						tempdistance[i][j]=centerdistance[i+1][j+1];
					}
				}
			for (i=1;i<centernum;i++)
				for (int j=i+1;j<=centernum;j++)
				{
					centerdistance[i][j]=tempdistance[i][j];
				}

		}//end if(td<T)
		else break;
		delete []tempdistance;
	}
	delete  []centerdistance;
}
/************************************************************
*函数名称		Leipingjunjulifa()
*参数			void
*返回值			void
*函数功能		按照类平均距离法法对全体样品进行分类
************************************************************/
void CCluster::Leipingjunjulifa()
{
	GetFeature();
	
	double	**centerdistance;//记录类间距离
	double T;//阈值
	int		distype;//距离的形式(欧氏、余弦。。。)
	double minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan;

	minous=MAX; mincos=MAX; minbcos=MAX; mintan=MAX;
	maxous=0; maxcos=0; maxbcos=0; maxtan=0;
	//计算四种距离模式的参考值
	for (int  i=0;i<patternnum-1;i++)
		for (int j=i+1;j<patternnum;j++)
		{
			if (minous>GetDistance(m_pattern[i],m_pattern[j],1))
				minous=GetDistance(m_pattern[i],m_pattern[j],1);
			if (maxous<GetDistance(m_pattern[i],m_pattern[j],1))
				maxous=GetDistance(m_pattern[i],m_pattern[j],1);

			if (mincos>GetDistance(m_pattern[i],m_pattern[j],2))
				mincos=GetDistance(m_pattern[i],m_pattern[j],2);
			if (maxcos<GetDistance(m_pattern[i],m_pattern[j],2))
				maxcos=GetDistance(m_pattern[i],m_pattern[j],2);

			if (minbcos>GetDistance(m_pattern[i],m_pattern[j],3))
				minbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			if (maxbcos<GetDistance(m_pattern[i],m_pattern[j],3))
				maxbcos=GetDistance(m_pattern[i],m_pattern[j],3);
			
			if (mintan>GetDistance(m_pattern[i],m_pattern[j],4))
				mintan=GetDistance(m_pattern[i],m_pattern[j],4);
			if (maxtan<GetDistance(m_pattern[i],m_pattern[j],4))
				maxtan=GetDistance(m_pattern[i],m_pattern[j],4);
		}
	DlgInfor mDlgInfor;
	mDlgInfor.ShowInfor(minous,maxous,mincos,maxcos,minbcos,maxbcos,mintan,maxtan);
	if (mDlgInfor.DoModal()==IDOK)
	{
		T=mDlgInfor.m_T;
		distype=mDlgInfor.m_DisType;
	}
	else return;

    //初始化
	for ( i=0;i<patternnum;i++)//每个样品自成一类
	{
		m_pattern[i].category=i+1;
	}

	centerdistance=new double *[patternnum];//建立类间距离数组,centerdistance[i][j]表示i类和j类距离
	for ( i=1;i<patternnum;i++)
	{
		centerdistance[i]=new double [patternnum+1];
	}

	for ( i=1;i<patternnum;i++)
		for (int j=i+1;j<=patternnum;j++)
		{
			centerdistance[i][j]=GetDistance(m_pattern[i-1],m_pattern[j-1],distype);
		}

	centernum=patternnum;

	while(1)
	{
		double td,**tempdistance;
		int ti,tj;//距离最小的类
		int numi,numj;//i,j类中的元素个数
		double dis1,dis2;

	    dis1=0;
		dis2=0;
		td=MAX;
		ti=0;
		tj=0;
		numi=0;
		numj=0;
		tempdistance= new double *[patternnum];//临时记录类间距离
		for (int i=1;i<patternnum;i++)
		{
			tempdistance[i]=new double[patternnum+1];
		}
		//找距离最近的两类ti,tj,记录最小距离td
		for( i=1;i<centernum;i++)
		{
			for (int j=i+1;j<=centernum;j++)
			{
				if (td>centerdistance[i][j])	
				{
					td=centerdistance[i][j];
					ti=i;tj=j;
				}
			}
		}

		if(td<T)//合并类ti,tj
		{
			centernum--;
			//对类间距离数组排序,以保持类号的连续性
			for (int i=1;i<centernum;i++)
				for (int j=i+1;j<=centernum;j++)
				{
					if (i<ti)
					{
						if(j==ti)
						{
							numi=0;numj=0;
							dis1=0;dis2=0;
							for (int m=0;m<patternnum;m++)
								if (m_pattern[m].category==i)
								{
									for (int n=0;n<patternnum;n++)
									{
										if (m_pattern[n].category==ti)
										{
											numi++;
											dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
										if(m_pattern[n].category==tj)
										{
											numj++;
											dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
									}
								}
                            tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
						}
						else if (j>=tj)
							tempdistance[i][j]=centerdistance[i][j+1];
						else
							tempdistance[i][j]=centerdistance[i][j];
					
					}
					else if (i==ti)
					{
						if (j<tj)
						{
							numi=0;numj=0;
							dis1=0;dis2=0;
							for (int m=0;m<patternnum;m++)
								if (m_pattern[m].category==j)
								{
									for (int n=0;n<patternnum;n++)
									{
										if (m_pattern[n].category==ti)
										{
											numi++;
											dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
										if(m_pattern[n].category==tj)
										{
											numj++;
											dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
									}
								}
                            tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
						
						}
                        else
						{
							numi=0;numj=0;
							dis1=0;dis2=0;
							for (int m=1;m<=patternnum;m++)
								if (m_pattern[m].category==(j+1))
								{
									for (int n=1;n<=patternnum;n++)
									{
										if (m_pattern[n].category==ti)
										{
											numi++;
											dis1+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
										if(m_pattern[n].category==tj)
										{
											numj++;
											dis2+=GetDistance(m_pattern[m],m_pattern[n],distype)*GetDistance(m_pattern[m],m_pattern[n],distype);
										}
									}
								}
                            tempdistance[i][j]=sqrt((dis1+dis2)/(numi+numj));
						
						}
					}
					else if((i>ti)&&(i<tj))
					{
						if(j<tj)
							tempdistance[i][j]=centerdistance[i][j];
						else
							tempdistance[i][j]=centerdistance[i][j+1];
					}
					else //i>=tj
					{
						tempdistance[i][j]=centerdistance[i+1][j+1];
					}
				}
			for (i=1;i<centernum;i++)
				for (int j=i+1;j<=centernum;j++)
				{
					centerdistance[i][j]=tempdistance[i][j];
				}

			for ( i=0;i<patternnum;i++)
			{
				if (m_pattern[i].category==tj)
					m_pattern[i].category=ti;
				if (m_pattern[i].category>tj)
					m_pattern[i].category--;
			}
			delete []tempdistance;
		}//end if(td<T)
		else break;
	}//end while
	delete []centerdistance;
}
/************************************************************
*函数名称		Kjunzhi()
*参数			void
*返回值		    void
*函数功能		按照K均值对全体样品进行分类
************************************************************/
void CCluster::Kjunzhi()
{

⌨️ 快捷键说明

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