📄 app_main.cpp
字号:
#include "rbf_cloud.h"
/***********生命函数****************/
void write_matrix(char* textname, double * matrix [],int i,int j);
void write_matrix(char* textname, int * matrix [],int i,int j);
void drop_Matrix_Space();
/************函数实现*********************/
void center(double * input){
double t=100;
for(int i=1;i<=7;i++){
t=100;
for(int j=1;j<=A_C[i-1];j++)
if(fabs(Ex[i][j]-input[i])<t){
c_p[i]=j;
t=fabs(Ex[i][j]-input[i]);
}
}
}
// 写到文件
void write_matrix(char* textname, double * matrix [],int i,int j){
fp=fopen(textname,"w");
if(fp==NULL){
cout<<"cannot open file"<<endl;
exit(0);
}
for(int ii=1;ii<=i;ii++)
{
for(int jj =1;jj<=j;jj++)
{
fprintf(fp,"%lf",matrix[ii][jj]);
fputc(' ',fp);
}
fputc('\n',fp);
}
fclose(fp);
}
void write_matrix(char* textname, int * matrix [],int i,int j){
fp=fopen(textname,"w");
if(fp==NULL){
cout<<"cannot open file"<<endl;
exit(0);
}
for(int ii=1;ii<=i;ii++)
{
for(int jj =1;jj<=j;jj++)
{
fprintf(fp,"%d",matrix[ii][jj]);
fputc(' ',fp);
}
fputc('\n',fp);
}
fclose(fp);
}
void write_matrix(char* textname, vector<double> matrix){
fp=fopen(textname,"w");
if(fp==NULL){
cout<<"cannot open file"<<endl;
exit(0);
}
for(int j =1;j<=matrix.size();j++)
{
fprintf(fp,"%lf",matrix[j]);
fputc(' ',fp);
}
fputc('\n',fp);
fclose(fp);
}
//将已经用matlab生成好的中心读入 输入为study.txt 中心输出到c[][];
void make_center()
{
int i =1,j=1;
double data=0.0;
// open the center.txt
fp=fopen("center.txt","r");
if(fp==NULL){
cout<<"cannot open file"<<endl;
exit(0);
}
//initial center
for(i;i<=7;i++){
for(j=1;j<=A_C[i-1];j++){
fscanf(fp,"%lf",&data);
Ex[i][j]=data;
fgetc(fp);
}
for(j=1;j<=A_C[i-1];j++){
fscanf(fp,"%lf",&data);
En[i][j]=data;
fgetc(fp);
}
for(j=1;j<=A_C[i-1];j++){
fscanf(fp,"%lf",&data);
He[i][j]=data;
fgetc(fp);
}
for(j=1;j<=A_C[i-1];j++){
fscanf(fp,"%lf",&data);
Peak[i][j]=data/10000;
fgetc(fp);
}
}
// 形成中心层
i = 1;
for(int i1=1; i1<=A_C[0]; i1++)
for(int i2=1; i2<=A_C[1]; i2++)
for(int i3=1; i3<=A_C[2]; i3++)
for(int i4=1; i4<=A_C[3]; i4++)
for(int i5=1; i5<=A_C[4]; i5++)
for(int i6=1; i6<=A_C[5]; i6++)
for(int i7=1; i7<=A_C[6]; i7++)
{
C[i][1]=i1;
C[i][2]=i2;
C[i][3]=i3;
C[i][4]=i4;
C[i][5]=i5;
C[i][6]=i6;
C[i][7]=i7;
i++;
}
// 中心形成完毕
fclose(fp);
}
//生成随机数
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
//生成正态随机数
double _sta(double mu,double sigma)
{
double r1,r2,r;
r1=_random();
r2=_random();
r=sqrt(-2*log(r1))*cos(2*PI*r2)*sigma+mu;
return r;
}
// 计算样本的输出向量
void compute_2(){
//模糊度k=5
int k =5;
double t=-100; int position =0;
for(int i=1;i<C_BUF;i++){
//为每一维生成五个正态随机数,期望是En[],方差是He[]
for(int j =1;j<=7; j++){
for(int ii=1;ii<=5;ii++){
Enk[j][ii]=_sta(En[j][C[i][j]],He[j][C[i][j]]);
}
}
//计算在这个中心上的输出值
double sum = 0.0;
u[s_input][i] = 0.0;
for(k=1;k<=5;k++){
sum = 0.0;
for(j=1;j<=7; j++){
sum+=Peak[j][C[i][j]]*((sample[j]-Ex[j][C[i][j]])*(sample[j]-Ex[j][C[i][j]])/(Enk[j][k])*(Enk[j][k]));
}
sum/=5;
u[s_input][i]+=exp(-sum/2);
}
// u[s_input][i]/=5;
if(u[s_input][i]>t){
t=u[s_input][i];
position = i;
}
}
cout<<"最大输出:"<<t<<endl;
cout<<"最近中心 ";
for(int j=1; j<=7;j++)
{
cout<<C[position][j]<<" ";
}
cout<<endl;
}
// 计算隐藏节点的输出矩阵(在训练时使用)
void compute_1(){
//从训练文件读入一个样本放入sample1[]中。
fp=fopen("study.txt","r");
if(fp==NULL){
cout<<"cannot open file"<<endl;
exit(0);
}
s_input = 1;
double temp;
while(!feof(fp)){
for(int i=1; i<=7; i++){
fscanf(fp,"%lf",&temp);
sample[i]=temp;
fgetc(fp);
}
center(sample);
//计算此样本的输出向量
compute_2();
//读取下一条样本数据
fscanf(fp,"%d",output1[s_input]+1);
while(fgetc(fp)!='\n'&&!feof(fp));
s_input ++;
}
s_input--;
fclose(fp);
}
double randnumber()//-0.1~0.1的随机函数
{
return (sin(rand())/10) ;
}
//用LMS法求权值
void compute_3(){
//初始化
double e = 0.0;
for(int j=0; j<C_BUF; j++)
w.push_back(randnumber());
double temp = 0.0;
//对每一个输入向量的中心输出进行权值逼近
for(int i=1;i<=s_input;i++){
temp = 0.0;
for(int ii=1; ii<C_BUF; ii++){
if(fabs(u[i][ii])<1e-6)
;
else temp+=w[ii]*u[i][ii];
}
e = output1[i][1]-temp;
cout<<e<<endl;
for(int j=1; j<C_BUF; j++){
if(fabs(u[i][j])<1e-6)
;
else w[j] = w[j]+2*miu*e*u[i][j];
}
}
write_matrix("quanzhi.txt",w);
}
//开辟矩阵空间
void creat_Matrix_Space(){
Ex= new double*[N_BUF];
for(int i=0;i<N_BUF;i++)
Ex[i] = new double[5];
En= new double*[N_BUF];
for( i=0;i<N_BUF;i++)
En[i] = new double[5];
He= new double*[N_BUF];
for( i=0;i<N_BUF;i++)
He[i] = new double[5];
Peak= new double*[N_BUF];
for( i=0;i<N_BUF;i++)
Peak[i] = new double[5];
Enk = new double *[N_BUF];
for( i=0;i<N_BUF;i++)
Enk[i] = new double[6];
C= new int*[C_BUF];
for( i=0;i<C_BUF;i++)
C[i]=new int[N_BUF];
/*
w= new double*[C_BUF];
for(i=0;i<C_BUF;i++)
w[i] = new double[O_BUF];
*/
sample = new double [8+1];
output1= new int*[S_BUF];
for(i=0;i<S_BUF;i++)
output1[i]= new int[O_BUF];
output2= new int*[S_BUF];
for(i=0;i<S_BUF;i++)
output2[i]= new int[O_BUF];
u= new double*[max_node];
for(i=0;i<max_node;i++)
u[i]= new double[C_BUF];
}
//回收空间
void drop_Matrix_Space(){
delete []Ex;
delete []En;
delete []Peak;
delete []He;
delete []C;
delete []sample;
delete []u;
delete []output1;
}
// 调用MATLAB画结果状态图
void plot(){
//混合编程
Engine *ep; //定义Matlab 引擎指针
if (!(ep=engOpen(NULL))) //测试是否启动 Matlab 引擎成功。
{
cout <<"Can't start Matlab engine!" <<endl;
exit(1);
}
//定义实数数组。
mxArray *xx = mxCreateDoubleMatrix(1,T_BUF-1, mxREAL);
mxArray *tt = mxCreateDoubleMatrix(1,T_BUF-1, mxREAL);
mxArray *oo = mxCreateDoubleMatrix(1,T_BUF-1, mxREAL);
double m_i[T_BUF-1], m_o[T_BUF-1], o[T_BUF-1];
for(int i=0;i<T_BUF-1;i++){
m_i[i]=matrix_in[i+1][1];
m_o[i]=matrix_out[i+1][1];
o[i]=output2[i+1][1];
}
memcpy(mxGetPr(xx), m_i, (T_BUF-1)*sizeof(double));// 将数组 x 复制到 mxarray 数组 xx 中。
memcpy(mxGetPr(tt), m_o, (T_BUF-1)*sizeof(double));// 将数组 y 复制到 mxarray 数组 yy 中。
memcpy(mxGetPr(oo), o, (T_BUF-1)*sizeof(double));// 将数组 z 复制到 mxarray 数组 zz 中。
engPutVariable(ep, "xx",xx);// 将 mxArray 数组 xx 写入到 Matlab 工作空间,命名为 xx
engPutVariable(ep, "oo",oo);// 将 mxArray 数组 yy 写入到 Matlab 工作空间,命名为 yy
engPutVariable(ep, "tt",tt);// 将 mxArray 数组 zz 写入到 Matlab 工作空间,命名为 zz
// 向 Matlab 引擎发送画图命令。 plot 为 Matlab 的画图函数
engEvalString(ep, "title('测试结果图')");
engEvalString(ep, "xlabel('X坐标'),ylabel('Y坐标');hold on");
engEvalString(ep, "plot(xx, oo,'r',xx, tt,'d');");
mxDestroyArray(xx); // 销毁 mxArray 数组 xx 和 yy 。
mxDestroyArray(tt);
mxDestroyArray(oo);
cout<<"绘图完毕,按任一键退出!" <<endl;
cin.get();
engClose(ep); // 关闭 Matlab 引擎。
return;
}
//测试
void rbf_test()
{
FILE * fp_test=NULL;
fp_test=fopen("test.txt","r");
if(!fp_test)
{
cout<<"cannot open file"<<endl;
exit(0);
}
int in=1;
// 开辟输入输出空间
matrix_in = new double *[T_BUF];
for(int i =1; i<T_BUF; i++)
matrix_in[i]=new double[N_BUF];
matrix_out= new double *[T_BUF];
for( i =1; i<T_BUF; i++)
matrix_out[i]=new double[O_BUF];
while (!feof(fp_test))
{ // 读入一个实验数据
for(int j=1; j<N_BUF; j++)
{
fscanf(fp_test,"%lf",input+j);
matrix_in[in][j] = input[j];
}
for( j=1;j<O_BUF;j++){
fscanf(fp_test,"%d",output2[in]+j);
}
while(fgetc(fp_test)!='\n'&&!feof(fp_test));
// 计算隐层节点输出
for(int i=1;i<C_BUF;i++){
//为每一维生成五个正态随机数,期望是En[],方差是He[]
for(int j =1;j<=7; j++){
for(int ii=1;ii<=5;ii++){
int c = C[i][j];
Enk[j][ii]=_sta(En[j][c],He[j][c]);
}
}
//计算在这个中心上的输出值
double sum = 0.0;
u[in][i] = 0.0;
for(int k=1;k<=5;k++){
sum = 0.0;
for(j=1;j<=7; j++){
int c = C[i][j];
sum+=Peak[j][c]*((matrix_in[in][j]-Ex[j][c])*(matrix_in[in][j]-Ex[j][c])/(Enk[j][k]*Enk[j][k]));
}
u[in][i]+=exp(-sum/2);
}
u[in][i]/=5;
}
//*****************************
double e = 0.0;
double result =0.0;
for(int jj=1;jj<C_BUF;jj++)
result+=w[jj]*u[in][jj];
matrix_out[in][1] = result;
in++;
}
// 画图
plot();
delete [] matrix_in;
delete [] matrix_out;
fclose(fp_test);
}
void init(){
w.clear();
w.push_back(0);
//读入权值
fp=fopen("quanzhi.txt","r");
if(!fp)
{
cout<<"cannot open file"<<endl;
exit(0);
}
int i =1;
double temp;
while(!feof(fp)){
fscanf(fp,"%lf",&temp);
w.push_back(temp);
fgetc(fp);
i++;
}
}
void main(){
creat_Matrix_Space();
//用聚集法形成中心
make_center();
compute_1();
compute_3();
//训练结束
//开始试验
//先建立中心
//make_center();
init();
rbf_test();
//测试结束
drop_Matrix_Space();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -