/*
模糊C聚类(mahalanobis距离)的C/C++程序实现
1.屏幕输入项:RULE_NUM Max_ITE FU_GRADE BAND图像的行列数ROW,COL
2.输出项:聚类结果图:ClusterResult.raw;聚类中心:Cluster_Center.txt
来源:遥感数据智能处理方法与程序设计 马建文等编著 科学出版社
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define RULE_NUM 7 //类别数目
#define Max_ITE 50 //最大迭代次数
#define FU_GRADE 2.5 //模糊加权指数,取值最佳范围为1.5-2.5
#define error 0.001 //隶属度学习终止函数
#define BAND 3 //波段数
double Random(double f)
{
double r;
r=(f*rand())/RAND_MAX;
if(r>=f) r=f;
return r;
}
void main()
{
long i,j,k,l,IT;
long NumPatterns,ROW,COL;//样本数
long ID_center[RULE_NUM];//记录聚类中心所属的类
long *I; //聚类中心或规则中心所对应的样本编号,-1是无样本与其对应
long *Labclass; //存放分类的结果
unsigned char *A,**band,**NumData,*result_image;
double err,U_SUM,ZI,Dij,Dik,Dequ,best,dist;
double **OLD_U;//OLD_U[Numpatterns][RULE_NUM]旧的模糊隶属度
double **U;// U[Numpatterns][RULE_NUM] 模糊隶属度 subjection
double **Rule_Center;//Rule_Center[RULE_NUM][BAND]存放聚类中心的位置
FILE *fp,*cluster_center,*fresult_class;
printf("屏幕输入图像的行列数:\n");
scanf("%d%d",&ROW,&COL);
NumPatterns=ROW*COL;
for(i=0;i<RULE_NUM;i++)
ID_center[i]=-1;//初始化类别信息
err=0.0;
A=new unsigned char[RULE_NUM];
for(i=0;i<RULE_NUM;i++)
A[i]=0;
I=new long[RULE_NUM];
for(i=0;i<RULE_NUM;i++)
I[i]=-1;
band=new unsigned char*[BAND];
for(i=0;i<BAND;i++)
band[i]=new unsigned char[NumPatterns];
NumData=new unsigned char*[NumPatterns];//开辟空间读入样本
for(i=0;i<NumPatterns;i++)
NumData[i]=new unsigned char[BAND];
Labclass=new long [NumPatterns];//空间大小等于样本数,开辟空间记录神经元所属类别
for(i=0;i<NumPatterns;i++)
Labclass[i]=-1;
result_image=new unsigned char[NumPatterns];
for(i=0;i<NumPatterns;i++)
result_image[i]=0;
//往通道中输入数据
fp=fopen("","rb");
- 1
- 2
- 3
- 4
- 5
前往页