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 + -
显示快捷键?