📄 update.cpp
字号:
#include "data.h"
#include "func.h"
double Update(double**u, double**data, double**center, int row, int col, int k)
{
int i,j,t;
double **p=NULL;
for(i=0;i<k;i++)
{
for(j=0;j<row;j++)
{
//模糊指数取2
u[i][j]=pow(u[i][j],2);
}
}
//根据隶属度矩阵计算聚类中心
p=MatrixMul(u,k,row,data,row,col);
for(i=0;i<k;i++)
{
//计算隶属度矩阵每行之和
double si=0;
for(j=0;j<row;j++)
{
si+=u[i][j];
}
for(t=0;t<col;t++)
{
center[i][t]=p[i][t]/si;
}
}
//计算各个聚类中心i分别到所有点j的距离矩阵dis(i,j)
double* a=new double[col]; //第一个样本点
double* b=new double[col]; //第二个样本点
double**dis=new double*[k]; //中心与样本之间距离矩阵
for(i=0;i<k;i++)
{
dis[i]=new double[row];
}
for(i=0; i<k; i++)
{
//聚类中心
for(t=0; t<col; t++)
{
a[t]=center[i][t];
}
//数据样本
for(j=0; j<row; j++)
{
for(t=0; t<col; t++)
{
b[t]=data[j][t];
}
double d=0;
//中心与样本之间距离的计算
for(t=0; t<col; t++)
{
d+=(a[t]-b[t])*(a[t]-b[t]);
}
dis[i][j]=sqrt(d);
}
}
//根据距离矩阵计算隶属度矩阵
for(i=0;i<k;i++)
{
for(j=0;j<row;j++)
{
double temp=0;
for(t=0;t<k;t++)
{
//dis[i][j]依次除以所在列的各元素,加和;2.3258995
//模糊指数为2.0
temp+=pow(dis[i][j]/dis[t][j],2/(2.0-1));
}
u[i][j]=1/temp;
}
}
//计算聚类有效性评价函数
double func1=0;
for(i=0;i<k;i++)
{
double func2=0;
for(j=0;j<row;j++)
{
func2+=pow(u[i][j],2.0)*pow(dis[i][j],2);
}
func1+=func2;
}
double obj_fcn=1/(1+func1);
return obj_fcn;
//内存释放
delete[]a;
delete[]b;
for(i=0;i<k;i++)
{
delete[]dis[i];
}
delete[]dis;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -