📄 zhong.cpp
字号:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
void main()
{
void standardization(float a[16][16]);
void distance(float a[16][16],float b[16][16]);
void ChangeMatrix(float b[16][16],int c[16]);
void out(float a[16][16]);
int i,j; //矩阵的行列坐标
int x=0; //记数变量
int count=10; //记数变量,统计矩阵变换后有效的类数
int judge[16]={1,1,1,1,1,1,1,1,1,1}; //判断数组,开始时置初始化的10个类均为有效
float array[16][16]={{250,1.5,1,1},{350,5,3,3},{200,2,2,1},{500,4,2,3},{100,1,2,1},{400,4,2,2},{380,4.5,3,2},{430,3.5,2,3},{230,1,1,1},{210,1.5,2,2}};
float dis[16][16]={0}; //保存每次计算后两两样本之间的距离
cout<<"将指标按权重量化后得到矩阵:"<<endl;
out(array);
standardization(array);
cout<<"标准化得到矩阵:"<<endl;
out(array);
cout<<"计算两两样本的距离,得到距离矩阵D0如下:"<<endl;
distance(array,dis);
while(count>4) //矩阵中只剩下四个有效类时,聚类完毕
{
x++;
count=0;
ChangeMatrix(dis,judge);
cout<<"经过一次变换,新的距离矩阵D"<<x<<"如下:"<<endl;
for(i=0;i<=15;i++) //统计经过计算后矩阵中有效的类数
{
if(judge[i]==1) count++;
}
for(i=0;i<=15;i++)
{
for(j=0;j<=15;j++)
{
if(judge[i]==1&&judge[j]==1) //行列均为有效,对应值才有效
cout<<setiosflags(ios::right)<<setw(7)<<dis[i][j];
}
cout<<endl;
}
}
}
/* 将聚阵指标按权重量化 */
void standardization(float a[16][16])
{
int i,j;
float min[4],max[4]; //保存每列各元的最大值,最小值
//最大值,最小值数组初始化为每列第一个元素
for(j=0;j<=3;j++)
{
min[j]=a[0][j];
max[j]=a[0][j];
}
// 求每列各元的最大值,最小值
for(j=0;j<=3;j++)
for(i=0;i<=9;i++)
{
if(a[i][j]>max[j]) max[j]=a[i][j];
if(a[i][j]<min[j]) min[j]=a[i][j];
}
// 由公式标准化矩阵
for(j=0;j<=3;j++)
for(i=0;i<=9;i++)
{
a[i][j]=(a[i][j]-min[j])/(max[j]-min[j]);
}
}
/* 计算两两样本的距离,得到距离矩阵D0 */
void distance(float a[16][16],float b[16][16])
{
int i,j,k;
for(i=0;i<=9;i++)
for(j=0;j<=9;j++)
{
for(k=0;k<=3;k++)
b[i][j]+=(float)(fabs(a[i][k]-a[j][k]));
}
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
cout<<setiosflags(ios::right)<<setw(7)<<b[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
/* 求出距离矩阵中的最小值,将最小值对应行列坐标的类并为
一个新类,并计算新类与其他类之间的距离 */
void ChangeMatrix(float b[16][16],int c[16])
{
static int a=9; //记录新产生的类在矩阵中对应的行列数
int *p=c;
float min; //距离矩阵中的最小值
int i,j; //矩阵的行列坐标
int m,n; //对应最小值的行列坐标
int l=1; //表示矩阵最小值尚未初始化
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
{
if(c[i]==1&&c[j]==1&&b[i][j]>0)
{
if(l==1)
{
min=b[i][j];
m=i;
n=j;
l=0;
}
else if(b[i][j]<min)
{
min=b[i][j];
m=i;
n=j;
}
}
}
c[m]=0; //最小值对应的行坐标置为无效
c[n]=0; //最小值对应的列坐标置为无效
a++;
*(p+a)=1; //将新聚合的类对应的矩阵行列坐标置为有效
cout<<"因为最小值为的d("<<m+1<<","<<n+1<<")"<<"="<<min<<endl;
cout<<"所以将"<<"G"<<m+1<<" "<<"G"<<n+1<<"合并为一个新类为G"<<a+1<<endl;
for(i=0;i<=15;i++)
{
if(c[i]==1)
{
if(a==i) b[a][a]=0; //类和自身的距离为0
else if(b[i][m]<b[i][n])
{
b[a][i]=b[i][m];
b[i][a]=b[i][m];
}
else
{
b[a][i]=b[i][n];
b[i][a]=b[i][n];
}
}
}
}
/* 输出函数 */
void out(float a[16][16])
{
for(int i=0;i<=9;i++)
{
for(int j=0;j<=3;j++)
{
cout<<setiosflags(ios::right)<<setw(8)<<a[i][j];
}
cout<<endl;
}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -