📄 复件 gzj.cpp
字号:
#include<stdio.h>
#include<malloc.h>
void hardlim(float **pW, int *p2, float *p3);//test
bool iszeroE(int *ptQ, int *pA); //test
void w_and_ep(float **pW, int *pE, int*p2);
void b_and_e(float *p_bsum, int *pE);
bool ispbool(int *pBool);
//输入向量P
int P_DIMENSION,p_dimension; //维数
int psum,PSUM,** p_psum=NULL; //矩阵p
//输出向量T
int Q_DIMENSION,q_dimension;// 维数
int tsum,**p_tsum=NULL;//矩阵
//神经元个数
int NERVE_CELL,nerve_cell;
//偏置矩阵B
float *p_bsum = NULL;
//权值矩阵W
float **p_wsum = NULL;
//实际输出向量S
int * pA=NULL;
//误差向量E
int * pE=NULL;
int * pBool=NULL;
void main(){
//输入向量p的个数
printf("请输入向量P的个数:= ");
scanf("%d",&PSUM);
psum=PSUM;
printf("向量P的个数=%d\n",psum);
//每个输入向P的维数
printf("请输入向量P的维数:= ");
scanf("%d",&P_DIMENSION);
p_dimension=P_DIMENSION;
printf("向量P的维数=%d\n",p_dimension);
//申请内存空间
p_psum = (int **)malloc(psum*sizeof(int));
for(int i=0; i<psum; i++){
*(p_psum + i) = (int *)malloc(p_dimension*sizeof(int));
}
//输入p的数值
printf("请输入向量P[%d][%d]\n",psum,p_dimension);
for(i=0; i<psum; i++){
for(int j=0; j<p_dimension; j++){
int temp;
printf("P[%d][%d]:",i,j);
scanf("%d",&temp);
*(*(p_psum+i) + j) = temp;
}
}
//打印矩阵
printf("打印矩阵T:\n");
for( i=0; i<psum; i++){
for(int j=0; j<p_dimension; j++){
printf("p[%d][%d]: %d\t",i,j,*(*(p_psum+i)+j));
}
printf("\n");
}
/*
*yi xia shi shu ru t
*/
// int tsum;//tsum shi dui ying mei ge shu ru p de shu chu
tsum = psum;
// int Q_DIMENSION,q_dimension; //q_dimension shi mei ge t de wei shu
// int **p_tsum=NULL;
//输入T的维数
printf("请输入目标输出向量T:\n");
printf("请输入目标输出向量T的维数(必须和神经元个数相同)=");
scanf("%d",&Q_DIMENSION);
q_dimension=Q_DIMENSION;
printf("q_dimension=%d\n",q_dimension);
p_tsum = (int **)malloc(tsum*sizeof(int));
for( i=0; i<tsum; i++){
*(p_tsum + i) = (int *)malloc(q_dimension*sizeof(int));
}
//输入向量T
printf("请输入目标输出向量T[%d][%d]:\n",tsum,q_dimension);
for(i=0; i<tsum; i++){
for(int j=0; j<q_dimension; j++){
int temp;
printf("T[%d][%d]:",i,j);
scanf("%d",&temp);
*(*(p_tsum+i) + j) = temp;
}
}
//打印向量T
//print jiang gang cai shu ru de da yin chu lai
printf("打印向量T:\n");
for( i=0; i<tsum; i++){
for(int j=0; j<q_dimension; j++){
printf("t[%d][%d]: %d\t",i+1,j+1,*(*(p_tsum+i)+j));
}
printf("\n");
}
//输入偏置B,可以任意输入
/*
*yi xia shi shu ru pian zhi b[], ke ren yin shu ru
*/
// int NERVE_CELL,nerve_cell; //nerve_cell wei sheng jing yuan ge shu
// float *p_bsum = NULL; //zhi xiang pian zhi ju zheng b de zhi zheng
printf("输入偏置B,可以任意输入");
printf("Enter nerve_cell:= ( nerve_cell must be equal q_dimension )\n");
scanf("%d",&NERVE_CELL);
nerve_cell=NERVE_CELL;
if(nerve_cell==q_dimension)
printf("nerve_cell=%d\n",nerve_cell);
else{
printf("Wrong! nerve_cell must be equal q_dimension, so you must restart from the begin!");
return;
}
p_bsum = (float *)malloc(nerve_cell*sizeof(float));
//////////////////////////////////////////////////////////
pA = (int *)malloc(nerve_cell*sizeof(int)); //test a[]
pE = (int *)malloc(nerve_cell*sizeof(int)); //test e[]
pBool = (int *)malloc(psum*sizeof(int));//test pbool[]
for(i=0; i<psum; i++){
*(pBool+i) = 0;
}
printf("Enter b[%d]\n",nerve_cell);
for(i=0; i<nerve_cell; i++){
float temp;
printf("please enter a number No.%d:",i+1);
scanf("%f",&temp);
*(p_bsum + i) = temp;
}
//打印偏置B
//print b[]
printf("print the numbers which you entered:\n");
for( i=0; i<nerve_cell; i++){
printf("b[%d]: %f\t",i+1,*(p_bsum+i));
}
//输入权值矩阵W
/*
*yi xia shi shu ru quan zhi ju zheng w[][], ke ren yin shu ru
*/
// float **p_wsum = NULL;
p_wsum = (float **)malloc(nerve_cell*sizeof(float));
for( i=0; i<nerve_cell; i++){
*(p_wsum + i) = (float *)malloc(p_dimension*sizeof(float));
}
printf("\n");
printf("Enter w[%d][%d]\n",nerve_cell,p_dimension);
for(i=0; i<nerve_cell; i++){
for(int j=0; j<p_dimension; j++){
float temp;
printf("please enter a number No.%d,No.%d:",i+1,j+1);
scanf("%f",&temp);
*(*(p_wsum+i) + j) = temp;
}
}
//打印权值矩阵W
//print jiang gang cai shu ru de da yin chu lai
printf("print the numbers which you entered:\n");
for( i=0; i<nerve_cell; i++){
for(int j=0; j<p_dimension; j++){
printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
}
printf("\n");
}
//以下是计算:
/*
*yi xia shi ji shuan
*
*/
//test
printf("以下是计算");
for(i=0; i<psum; i++){
printf("pbool[%d]:%d\t",i+1,*(pBool+i));
}
printf("\n");
printf("\n==========compute begin==========\n");
while(true){
for(int m=0; m<psum; m++){
hardlim(p_wsum, *(p_psum+m), p_bsum);//test pA中已经做了pE的计算
//pirnt a[] ???????????????????????????????
for( i=0; i<nerve_cell; i++){
printf("a[%d]: %d\t",i+1,*(pA+i));
}
printf("\n");
if(iszeroE(*(p_tsum+m), pA)){
*(pBool+m)=1;
continue;
}else{
*(pBool+m)=0;
w_and_ep(p_wsum, pE, *(p_psum+m));
//print w[][]??????????????????????????????
printf("\n");
for( i=0; i<nerve_cell; i++){
for(int j=0; j<p_dimension; j++){
printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
}
printf("\n");
}
printf("\n");
b_and_e(p_bsum, pE);
//print b[]?????????????????????????????????
for( i=0; i<nerve_cell; i++){
printf("b[%d]: %f\t",i+1,*(p_bsum+i));
}
printf("\n");
}
}//end for
//print pbool[]??????????????????????????????
printf("\n");
for(i=0; i<psum; i++){
printf("pbool[%d]:%d\t",i+1,*(pBool+i));
}
printf("\n");
if(ispbool(pBool))
break;
}//end while
printf("\n==========compute end=========\n");
//print the result w[][]
printf("the result w[][] and b[] is :\n");
for( i=0; i<nerve_cell; i++){
for(int j=0; j<p_dimension; j++){
printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
}
printf("\n");
}
printf("\n");
//printthe result b[]
for( i=0; i<nerve_cell; i++){
printf("b[%d]:%f\t",i+1,*(p_bsum+i));
}
printf("\n\n");
return;
}
void hardlim(float **pW, int *p2, float *p3){
float sum = 0.0f;
for(int i=0; i<nerve_cell; i++){ //S为神经元个数
for(int j=0; j<p_dimension; j++){
sum+=(*(*(pW+i)+j)) * (*(p2+j));
}
sum += *(p3 + i);
if(sum>=0){
sum=1;
*(pA+i)=(int)sum;
}else{
sum=0;
*(pA+i)=(int)sum;
}
}
}
bool iszeroE(int *ptQ, int *pA){
for(int i=0; i<nerve_cell; i++){
*(pE+i)=*(ptQ+i) - *(pA+i);
}
//print e[]?????????????????????????????
for(int j=0; j<nerve_cell; j++){
printf("e[%d]:%d\t",j+1,*(pE+j));
}
printf("\n");
int count=0;
for( i=0; i<nerve_cell; i++){
if(*(pE+i)==0)
count++;
}
if(count==nerve_cell)
return true;
else{
count=0;
return false;
}
}
void w_and_ep(float **pW, int *pE, int*p2){ //公式4。38
for(int i=0; i<nerve_cell; i++){
for(int j=0; j<p_dimension; j++)
*(*(pW+i)+j) += *(pE+i) * *(p2+j);
}
}
void b_and_e(float *p_bsum, int *pE){ //公式4。39
for(int i=0; i<nerve_cell; i++){
*(p_bsum+i)+=(float)*(pE+i);
}
}
bool ispbool(int *pBool){
for(int i=0; i<psum; i++){
if(*(pBool+i)!=1)
return false;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -