代码Word格式.docx
- 文档编号:22064038
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:26
- 大小:21.88KB
代码Word格式.docx
《代码Word格式.docx》由会员分享,可在线阅读,更多相关《代码Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
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*)));
//printf("
ALLOC_2D_DBL:
tallocatearrayofdblptrs\n"
for(i=0;
i<
m;
i++){
new1[i]=alloc_1d_dbl(n);
/***设置随机数种子***/
voidbpnn_initialize(intseed)
//printf("
Randomnumbergeneratorseed:
%d\n"
seed);
srand(seed);
/***随机初始化权值***/
voidbpnn_randomize_weights(double**w,intm,intn)
inti,j;
=m;
for(j=0;
j<
=n;
j++){
w[i][j]=dpn1();
}
/***0初始化权值***/
voidbpnn_zero_weights(double**w,intm,intn)
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;
=n2;
/***计算输入的加权总和***/
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;
=nj;
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)
doubleh,sum,errsum;
=nh;
h=hidden[j];
for(k=1;
=no;
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;
=ndelta;
=nly;
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)
if((fp=fopen(name,"
rb"
))==NULL)
:
:
MessageBox(NULL,"
无法读取权值信息"
NULL,MB_ICONSTOP);
return(false);
fread((char*)buffer,sizeof(double),(n1+1)*(n2+1),fp);
w[i][j]=buffer[i*(n2+1)+j];
return(true);
/*****保存各层结点的数目******/
voidw_num(intn1,intn2,intn3,char*name)
int*buffer;
buffer=(int*)malloc(3*sizeof(int));
buffer[0]=n1;
buffer[1]=n2;
buffer[2]=n3;
fwrite((char*)buffer,sizeof(int),3,fp);
/********读取各层结点数目*********/
boolr_num(int*n,char*name)
buffer=(int*)malloc(3*sizeof(int));
结点参数"
fread((char*)buffer,sizeof(int),3,fp);
n[0]=buffer[0];
n[1]=buffer[1];
n[2]=buffer[2];
/********************************************************
*函数名称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<
num;
k++)
{
//统计每行的象素点个数
lSheight;
//对统计变量初始化
sum=0;
//对每个数据逐列扫描
for(j=k*lSwidth;
(k+1)*lSwidth;
{
//指向图像第i行第j列个象素的指针
lpSrc=lpDIBBits+i*lLineByte+j;
//如果这个象素是黑色的
if(*(lpSrc)==0)
//统计变量加
sum++;
data[k][i]=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);
//获取图像高度
LONGlHeight=:
DIBHeight((char*)lpDIB);
//获取图像宽度
LONGlWidth=:
DIBWidth((char*)lpDIB);
LONGwidth=lWidth/num;
//每行的字节数
LONGlLineBytes=WIDTHBYTES(lWidth*8);
intb;
//存储临时的特征
double*tz=newdouble[dim];
k++)
for(i=0;
dim;
i++)tz[i]=0;
//提取前个特征
for(m=0;
m<
8;
m++)
{for(i=int(m/2)*8;
(int(m/2)+1)*8;
for(j=m%2*8+k*width;
(m%2+1)*8+k*width;
{lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j;
b=(*lpSrc==255)?
0:
1;
tz[m]+=b;
}
//提取第个特征-总象素值
lHeight;
for(j=k*width;
(k+1)*width;
{lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*i+j;
b=(*lpSrc==255)?
tz[8]+=b;
}
//提取第、个特征-水平扫描切割
i=int(lHeight*1/3);
tz[9]+=b;
//
i=int(lHeight*2/3);
tz[10]+=b;
//提取第、个特征-垂直扫描切割
j=int(k*width+width*1/3);
for(i=0;
tz[11]+=b;
j=int(k*width+width*2/3);
tz[12]+=b;
//存储特征
tezheng[k][i]=tz[i];
:
GlobalUnlock((HGLOBAL)hDIB);
//返回特征向量矩阵的指针
returntezheng;
/**********************************
*函数名称code()
*BYTE*lpDIBBits-指向输入图像的象素其实位置的指针
*intnum-图片中样本的个数
*LONGlLineByte-输入图片每行的字节数
*LONGlSwidth-预处理时归一化的宽度
*LONGlSheight-预处理时归一化的长度
*每一个象素都作为特征提取出来
**************************************/
double**code(BYTE*lpDIBBits,intnum,LONGlLineByte,LONGlSwidth,LONGlSheight)
data=alloc_2d_dbl(num,lSwidth*lSheight);
//对每个数据逐行扫描
{
//对每个数据逐列扫描
for(j=k*lSwidth;
{
//指向图像第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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)