代码.docx
- 文档编号:8927888
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:26
- 大小:21.88KB
代码.docx
《代码.docx》由会员分享,可在线阅读,更多相关《代码.docx(26页珍藏版)》请在冰豆网上搜索。
代码
#include
#include
#include
#include
#defineBIGRND32767
doubledrnd();
doubledpn1();
doublesquash(doublex);
double*alloc_1d_dbl(intn);
double*alloc_1d_dbl(intn);
double**alloc_2d_dbl(intm,intn);
voidbpnn_initialize(intseed);
voidbpnn_randomize_weights(double**w,intm,intn);
voidbpnn_zero_weights(double**w,intm,intn);
voidbpnn_layerforward(double*l1,double*l2,double**conn,intn1,intn2);
voidbpnn_output_error(double*delta,double*target,double*output,intnj);
voidbpnn_hidden_error(double*delta_h,intnh,double*delta_o,intno,double**who,double*hidden);
voidbpnn_adjust_weights(double*delta,intndelta,double*ly,intnly,double**w,double**oldw,doubleeta,doublemomentum);
voidw_weight(double**w,intn1,intn2,char*name);
boolr_weight(double**w,intn1,intn2,char*name);
voidw_num(intn1,intn2,intn3,char*name);
boolr_num(int*n,char*name);
voidcode(BYTE*image,int*p,intw,inth,intdw);
voidBpTrain(HDIBhDIB,intn_hidden,doublemin_ex,doublemomentum,doubleeta,intwidth,intheight);
voidCodeRecognize(HDIBhDIB,intwidth,intheight,intn_in,intn_hidden,intn_out);
/***返回-的双精度随机数***/
doubledrnd()
{
return((double)rand()/(double)BIGRND);
}
/***返回-1.0到.0之间的双精度随机数***/
doubledpn1()
{
return((drnd()*2.0)-1.0);
}
doublesquash(doublex)
{
return(1.0/(1.0+exp(-x)));
}
/***申请维双精度实数数组***/
double*alloc_1d_dbl(intn)
{
double*new1;
new1=(double*)malloc((unsigned)(n*sizeof(double)));
if(new1==NULL){
printf("ALLOC_1D_DBL:
Couldn'tallocatearrayofdoubles\n");
return(NULL);
}
return(new1);
}
/***申请维双精度实数数组***/
double**alloc_2d_dbl(intm,intn)
{
inti;
double**new1;
new1=(double**)malloc((unsigned)(m*sizeof(double*)));
if(new1==NULL){
//printf("ALLOC_2D_DBL:
Couldn'tallocatearrayofdblptrs\n");
return(NULL);
}
for(i=0;i new1[i]=alloc_1d_dbl(n); } return(new1); } /***设置随机数种子***/ voidbpnn_initialize(intseed) { //printf("Randomnumbergeneratorseed: %d\n",seed); srand(seed); } /***随机初始化权值***/ voidbpnn_randomize_weights(double**w,intm,intn) { inti,j; for(i=0;i<=m;i++){ for(j=0;j<=n;j++){ w[i][j]=dpn1(); } } } /***0初始化权值***/ voidbpnn_zero_weights(double**w,intm,intn) { inti,j; for(i=0;i<=m;i++){ for(j=0;j<=n;j++){ w[i][j]=0.0; } } } /*********前向传输*********/ voidbpnn_layerforward(double*l1,double*l2,double**conn,intn1,intn2) { doublesum; intj,k; /***设置阈值***/ l1[0]=1.0; /***对于第二层的每个神经元***/ for(j=1;j<=n2;j++){ /***计算输入的加权总和***/ sum=0.0; for(k=0;k<=n1;k++){ sum+=conn[k][j]*l1[k]; } l2[j]=squash(sum); } } /*输出误差*/ voidbpnn_output_error(double*delta,double*target,double*output,intnj) { intj; doubleo,t,errsum; errsum=0.0; for(j=1;j<=nj;j++){ o=output[j]; t=target[j]; delta[j]=o*(1.0-o)*(t-o); } } /*隐含层误差*/ voidbpnn_hidden_error(double*delta_h,intnh,double*delta_o,intno,double**who,double*hidden) { intj,k; doubleh,sum,errsum; errsum=0.0; for(j=1;j<=nh;j++){ h=hidden[j]; sum=0.0; for(k=1;k<=no;k++){ sum+=delta_o[k]*who[j][k]; } delta_h[j]=h*(1.0-h)*sum; } } /*调整权值*/ voidbpnn_adjust_weights(double*delta,intndelta,double*ly,intnly,double**w,double**oldw,doubleeta,doublemomentum) { doublenew_dw; intk,j; ly[0]=1.0; for(j=1;j<=ndelta;j++){ for(k=0;k<=nly;k++){ new_dw=((eta*delta[j]*ly[k])+(momentum*oldw[k][j])); w[k][j]+=new_dw; oldw[k][j]=new_dw; } } } /*******保存权值**********/ voidw_weight(double**w,intn1,intn2,char*name) { inti,j; double*buffer; FILE*fp; fp=fopen(name,"wb+"); buffer=(double*)malloc((n1+1)*(n2+1)*sizeof(double)); for(i=0;i<=n1;i++) { for(j=0;j<=n2;j++) buffer[i*(n2+1)+j]=w[i][j]; } fwrite((char*)buffer,sizeof(double),(n1+1)*(n2+1),fp); fclose(fp); free(buffer); } /************读取权值*************/ boolr_weight(double**w,intn1,intn2,char*name) { inti,j; double*buffer; FILE*fp; if((fp=fopen(name,"rb"))==NULL) { : : MessageBox(NULL,"无法读取权值信息",NULL,MB_ICONSTOP); return(false); } buffer=(double*)malloc((n1+1)*(n2+1)*sizeof(double)); fread((char*)buffer,sizeof(double),(n1+1)*(n2+1),fp); for(i=0;i<=n1;i++) { for(j=0;j<=n2;j++) w[i][j]=buffer[i*(n2+1)+j]; } fclose(fp); free(buffer); return(true); } /*****保存各层结点的数目******/ voidw_num(intn1,intn2,intn3,char*name) { FILE*fp; fp=fopen(name,"wb+"); int*buffer; buffer=(int*)malloc(3*sizeof(int)); buffer[0]=n1; buffer[1]=n2; buffer[2]=n3; fwrite((char*)buffer,sizeof(int),3,fp); fclose(fp); free(buffer); } /********读取各层结点数目*********/ boolr_num(int*n,char*name) { int*buffer; FILE*fp; buffer=(int*)malloc(3*sizeof(int)); if((fp=fopen(name,"rb"))==NULL) { : : MessageBox(NULL,"结点参数",NULL,MB_ICONSTOP); return(false); } fread((char*)buffer,sizeof(int),3,fp); n[0]=buffer[0]; n[1]=buffer[1]; n[2]=buffer[2]; fclose(fp); free(buffer); return(true); } /******************************************************** *函数名称VerticalCode() * *参量: *BYTE*lpDIBBits-指向输入图像的象素其实位置的指针 *intnum-图片中样本的个数 *LONGlLineByte-输入图片每行的字节数 *LONGlSwidth-预处理时归一化的宽度 *LONGlSheight-预处理时归一化的长度 * *返回值: *double**-特征向量矩阵 * *函数功能: *对于输入样本提取特征向量,在这里把归一化样本的 *水平和竖直方向的统计特征作为特征提取出来 ***************************************************************/ double**VerticalCode(BYTE*lpDIBBits,intnum,LONGlLineByte,LONGlSwidth,LONGlSheight) { //循环变量 inti,j,k; BYTE*lpSrc; //统计变量 intsum; //建立保存特征向量的二维数组 double**data; //为这个数组申请二维存储空间 data=alloc_2d_dbl(num,lSwidth+lSheight); //将归一化的样本的每个象素作为一个特征点提取出来 //逐个数据扫描 for(k=0;k { //统计每行的象素点个数 for(i=0;i { //对统计变量初始化 sum=0; //对每个数据逐列扫描 for(j=k*lSwidth;j<(k+1)*lSwidth;j++) { //指向图像第i行第j列个象素的指针 lpSrc=lpDIBBits+i*lLineByte+j; //如果这个象素是黑色的 if(*(lpSrc)==0) //统计变量加 sum++; } data[k][i]=sum; } //统计每列的象素点个数 for(j=k*lSwidth;j<(k+1)*lSwidth;j++) { //对统计变量初始化 sum=0; //对每个数据逐行扫描 for(i=0;i { //指向图像第i行第j列个象素的指针 lpSrc=lpDIBBits+i*lLineByte+j; //如果这个象素是黑色的 if(*(lpSrc)==0) //统计变量加 sum++; } data[k][j-k*lSwidth+lSheight]=sum; } } //返回特征向量矩阵 return(data); } /******************************************************************* * *函数名称: *TZTQ_13 *参数: *HDIBhDIB-待提取特征的位图的句柄 *intnum-字符的数目 *intdim-提取特征的维数。 这里固定为 *说明: *图像分为块,作为个特征;象素总数作为一个特征;水平切割过去两条线,得*到两个特征;垂直的两个,总共得到个特征 * *********************************************************************/ double**TZTQ_13(HDIBhDIB,intnum,intdim) { inti,j,k,m; //分配一个内存空间并得到二维指针 double**tezheng=alloc_2d_dbl(num,dim); //锁定图像句柄并获取其指针 BYTE*lpDIB=(BYTE*): : GlobalLock((HGLOBAL)hDIB); //取得图像象素数据区的起始地址 BYTE*lpDIBBits=(BYTE*): : FindDIBBits((char*)lpDIB); BYTE*lpSrc; //获取图像高度 LONGlHeight=: : DIBHeight((char*)lpDIB); //获取图像宽度 LONGlWidth=: : DIBWidth((char*)lpDIB); LONGwidth=lWidth/num; //每行的字节数 LONGlLineBytes=WIDTHBYTES(lWidth*8); intb; //存储临时的特征 double*tz=newdouble[dim]; for(k=0;k { for(i=0;i //提取前个特征 for(m=0;m<8;m++) {for(i=int(m/2)*8;i<(int(m/2)+1)*8;i++) for(j=m%2*8+k*width;j<(m%2+1)*8+k*width;j++) {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[m]+=b; } } //提取第个特征-总象素值 for(i=0;i for(j=k*width;j<(k+1)*width;j++) {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[8]+=b; } //提取第、个特征-水平扫描切割 i=int(lHeight*1/3); for(j=k*width;j<(k+1)*width;j++) {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[9]+=b; } // i=int(lHeight*2/3); for(j=k*width;j<(k+1)*width;j++) {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[10]+=b; } //提取第、个特征-垂直扫描切割 j=int(k*width+width*1/3); for(i=0;i {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[11]+=b; } j=int(k*width+width*2/3); for(i=0;i {lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j; b=(*lpSrc==255)? 0: 1; tz[12]+=b; } //存储特征 for(i=0;i tezheng[k][i]=tz[i]; } : : GlobalUnlock((HGLOBAL)hDIB); //返回特征向量矩阵的指针 returntezheng; } /********************************** *函数名称code() * *参量: *BYTE*lpDIBBits-指向输入图像的象素其实位置的指针 *intnum-图片中样本的个数 *LONGlLineByte-输入图片每行的字节数 *LONGlSwidth-预处理时归一化的宽度 *LONGlSheight-预处理时归一化的长度 * *函数功能: *对于输入样本提取特征向量,在这里把归一化样本的 *每一个象素都作为特征提取出来 **************************************/ double**code(BYTE*lpDIBBits,intnum,LONGlLineByte,LONGlSwidth,LONGlSheight) { //循环变量 inti,j,k; BYTE*lpSrc; //建立保存特征向量的二维数组 double**data; //为这个数组申请二维存储空间 data=alloc_2d_dbl(num,lSwidth*lSheight); //将归一化的样本的每个象素作为一个特征点提取出来 //逐个数据扫描 for(k=0;k { //对每个数据逐行扫描 for(i=0;i { //对每个数据逐列扫描 for(j=k*lSwidth;j<(k+1)*lSwidth;j++) { //指向图像第i行第j列个象素的指针 lpSrc=lpDIBBits+i*lLineByte+j; //如果这个象素是黑色的 if(*(lpSrc)==0) //将特征向量的相应位置填 data[k][i*lSwidth+j-k*lSwidth]=1; //如果这个象素是其他的 if(*(lpSrc)! =0) //将特征向量的相应位置填 data[k][i*lSwidth+j-k*lSwidth]=0; } } } return(data);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码