jlfx.cpp

来自「模糊数学中聚类分析的算法」· C++ 代码 · 共 229 行

CPP
229
字号
# include<stdio.h>
# include<math.h>
# define X 5//二维数组的行数
# define Y 4//二维数组的列数

float r[X][X];
void  simulate(int a[][Y]);
void  Closure(float r[X][X]);
void main()
{
	int i,j, a[X][Y];

	printf("please input a[%d][%d]:\n",X,Y);
	for(i=0;i<X;i++)
	  for(j=0;j<Y;j++)
		{
		  scanf("%5d",&a[i][j]);
		}//输入二维数组a[X][Y]的初值

	printf("Now print a[%d][%d]=",X,Y);
	for(i=0;i<X;i++)
	{
		printf("\n");
		for(j=0;j<Y;j++)
			printf("%5d",a[i][j]);
	}//输出二维数组a[X][Y]
	printf("\n");

	 simulate(a);//调用simulate函数

     Closure(r);
}

 void  simulate(int a[][Y])//求相似矩阵 
	{
		int i,j,k,temp,b[X][X];
		int max=0,num=0;
		float c;

		for(i=0;i<X-1;i++)//第i行
			for(j=i+1;j<X;j++)//第j=i+1行
			{
				if(i==(j-1)) b[i][j-1]=0;//令对角线元素为0
				for(k=0;k<Y;k++)//第k列
				{
					temp=a[i][k]-a[j][k];//不同的两行对应的元素相减
					if(temp<0)
						num=num+abs(temp);//求绝对值
					else
						num=num+temp;
				}
				b[i][j]=num;
				b[j][i]=b[i][j];//相似矩阵对称性
				num=0;//清零
			}

		b[i][j-1]=0;//b[i][j]的最后一个元素为0 
	    printf("\n");

        printf("Now print b[%d][%d]=",X,X);
        for(i=0;i<X;i++)
		{
			printf("\n");
			for(j=0;j<X;j++)
			{
				if(b[i][j]>max)
				max=b[i][j];
				printf("%5d",b[i][j]);
			}
		}//打印b[X][X]=|aik-ajk|


		if(max<=10 && max>=0)
			  c=0.1;
		else if(max>10 && max<=100)
		      c=0.01;//c值的确定
	    printf("\nc=%f\n",c);

		for(i=0;i<X;i++)
			for(j=0;j<X;j++)
				r[i][j]=1-c*b[i][j];//求相似举证r[i][j]

		printf("Now print r[%d][%d]=",X,X);
		for(i=0;i<X;i++)
		{
			printf("\n");
			for(j=0;j<X;j++)
				printf("%.1f  ",r[i][j]);//.1表示打印小数后面一位
		}//打印相似矩阵
	}


void Closure(float r[X][X])//求等价矩阵
	{
		int i,j,k,m,flag=1;
		float r2[X][X],b[X],max;
		max=0;m=0;flag=1;

		for(i=0;i<X;i++)
			for(j=0;j<X;j++)
			{
				for(k=0;k<X;k++)
				{
					b[m]=r[i][k]<r[k][j]?r[i][k]:r[k][j];//求与运算
					if(b[m]>max) max=b[m];//通过找最大元素实现或运算
					m++;//计数b[X]中实际存在元素的个数
				}
			
			    r2[i][j]=max;//max的值为r2[X][X]中的元素
				max=0;//清零
				m=0;//清零
			}//给r2[X][X]中赋值

		
			printf("\n\nNow print r2[%d][%d]=",X,X);
			for(i=0;i<X;i++)
			{
				printf("\n");
				for(j=0;j<X;j++)
					printf("%.1f  ",r2[i][j]);//.1表示打印小数后面一位
			}//打印相似矩阵


	    	for(i=0;i<X;i++)
				for(j=0;j<X;j++)
				{
				  if(r2[i][j]!=r[i][j])
					{
						flag=0;
						Closure(r2);//递归调用求等价矩阵
					}
				}
       
	
			if(flag==1)
			{
				printf("Find out the closure r:\n");
				for(i=0;i<X;i++)
				{
					printf("\n");
					for(j=0;j<X;j++)
						printf("%.1f ",r[i][j]);
				}
			  	
			}//打印等价矩阵   
	}


void search(float r[X][X])
	{
		int i,j, m,count,flag;
		float temp,w[X*X/2];
		flag=1;
		w[0]=r[0][0];//赋第一个值
		count=1;//计数器初始值

		for(i=0;i<X;i++)
			for(j=0;j<X;j++)
				for(m=0;m<count;m++)
				{
					if(r[i][j]==w[m])
					{
						flag=0;
						break;
					}
					else
					{
						w[m]=r[i][j];
						count++;//计数w[X*X/2]中元素的个数
					}
				}//找数值不相同的w

         for(i=0;i<count;i++)
			 for(j=0;j<count-i;i++)
				 if(w[j+1]>w[j])
				 {
					 temp=w[j];w[j]=w[j+1];w[j+1]= temp;
				 }//冒泡排序使w[X*X/2]从大到小有序

        for(i=0;i<count;i++)
			printf("%f",w[i]);//打印有序的w[X*X/2]值

	   // classfy(r,w);//调用classfy函数
	}


void classfy(float r[X][X],float w[X*X/2])//分类
	{
		int i,j,k,R[X][X];
		float cur;
		
		for(k=0;k<X*X/2;k++)//count?
		{
			cur=w[k];
			printf("\n");
			printf("w is %f:",cur);
			for(i=0;i<X;i++)
				for(j=0;j<X;j++)
				{
					if(r[i][j]>=cur) R[i][j]=1;
					else R[i][j]=0;
				}//求分类矩阵

		    for(i=0;i<X;i++)
			{
			    printf("\n");
			    for(j=0;j<X;j++)
				{
				printf("%5d",R[i][j]);
				}
			}//打印分类矩阵
		}
	}
					
					

	
					 






	



⌨️ 快捷键说明

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