kmean算法的c语言实现
kmean算法的c语言实现
//#include "mpi.h"
#include
#include
#include
#define bufsize 256//读取数据集的每一行所用字符串的大小
#define K 10//最终聚类个数
long int totalnumber;
typedef struct point
{
double x;
double y;
int clusterid;
}Point;
typedef struct cluster
{
int id;
long int number;
Point *p;
}Cluster;
Point* readData()//从文本中读取数据集存贮在数组指针中
{
char buf[bufsize];//动态读取每一行都字符串数组
int r=0,i;//r是buf中字符个数
long int number=0,j=0,k=0;//number为总共行数,即数据点都个数
FILE *f=0;
FILE *f0=0;
f=fopen("sample.txt","r");
f0=fopen("sample.txt","r");
if(f==NULL||f0==NULL)
{
printf("file open fault!\n");
exit(0);
}
Point *p;//指向结构体的指针
while(fgets(buf,bufsize,f0)!=NULL)
{
number++;
}
totalnumber=number;
//printf("%d\n",number);
p=(Point *)malloc(sizeof(Point)*number);//为其分配空间大小,存贮number个数据点
for(j=0;j
{
p[j].x=0.0;
p[j].y=0.0;
p[j].clusterid=0;//初始化所有类标号为0
}
//prin();
while(fgets(buf,bufsize,f)!=NULL)//第二次遍历文本,得到数据集的结构体指针数组形式
{
while((buf[r]>=48&&buf[r]<=57)||buf[r]==32||buf[r]==46)//获取每一行中实际存在的字符个数
{
r++;
}
for(i=1;i<=7;i++)
{
if(buf[r-i]==10)
{
r=r-i;
}
}
//printf("%d\n",r);
int k1=0,k2;//分别获取x和y对应的字符串长度
for(i=0;i
{
if(buf[i]!=32)
{
k1++;
}
if(buf[i]==32)
{
break;
}
}
k2=k1;
for(i=k1;i
{
if(buf[i]==32)
{
k2++;
}
}
//printf("%d %d %d\n",k1,k2,r);
char *xx,*yy;
xx=(char *)malloc(sizeof(char)*k1);
yy=(char *)malloc(sizeof(char)*(r-k2));
for(i=0;i
{
xx[i]=buf[i];
}
for(i=0;i
{
yy[i]=buf[k2+i];
}
//printf("%c\n",buf[k2]);
//printf("%s\n",yy);
if(k
{
p[k].x=atof(xx);//将字符串转换为浮点数
p[k].y=atof(yy);
//printf("%10f %10f %d\n",p[k].x,p[k].y,p[k].clusterid);
}
else
{
break;
}
k++;
}
//printf("%d %d\n",k,number);
fclose(f0);
fclose(f);
return p;//返回数据集的指针形式,便于操作
}
Point* initializecenter()//初始化中心
{
Point *p1,*p2;
long int i,a,cnt,