📄 feedforward.cpp
字号:
//该函数实现分类的过程
/* 输入参数:
prototype -- 指向prototype部分的指针
N -- prototype部分的结点个数
exemplar -- 指向exemplar部分的指针
M -- exemplar部分的结点个数
sample -- 输入模式
L -- 输入模式的维数
输出参数:
输入模式属于的类号
*/
#include <math.h>
#include <stdio.h>
#include "FuzzyNN.h"
#include "tools.h"
int feedforward(ProtoNode *prototype,int N,ExemNode *exemplar,int M,FuzzyNum *sample,int L)
{
int i,j;
double *s;
s=new double[N+1];
mcheck(s);
//计算s1,s2,...,sN,并求其最大值
for(j=1;j<=N;j++)
{
s[j]=0;
for(i=1;i<=L;i++)
s[j]+=(coa(sample[i])-coa((prototype[j].w)[i]))*(coa(sample[i])-coa((prototype[j].w)[i]));
s[j]=s[j]/L;
s[j]=sqrt(s[j]);
s[j]=1-s[j];
}
double pmax; //s1,s2,...,sN中的最大值
int pindex; //最大值对应的下标
pmax=s[1];
pindex=1;
for(i=2;i<=N;i++)
if(s[i]>pmax)
{
pmax=s[i];
pindex=i;
}
//如果exemplar不为空的话,计算r1,r2,...,rM,并求其最大值
double emax=0; //r1,r2,...,rM中的最大值
int eindex=0; //最大值对应的下标
if(exemplar!=NULL)
{
double *r;
r=new double[M+1];
mcheck(r);
j=0;
ExemNode *p=exemplar;
int flag;
while(p!=NULL)
{
j++;
r[j]=0;
flag=1;
for(i=1;i<=L;i++)
if(!((p->v)[i].w1<=sample[i].w1 && (p->v)[i].w2>=sample[i].w2))
flag=0;
if(flag)
{
for(i=1;i<=L;i++)
r[j]+=(sample[i].w1-(p->v)[i].w1)*(sample[i].w1-(p->v)[i].w1)+(sample[i].w2-(p->v)[i].w2)*(sample[i].w2-(p->v)[i].w2);
r[j]=r[j]/L;
r[j]=sqrt(r[j]);
r[j]=2-r[j];
}
p=p->next;
}
emax=r[1];
eindex=1;
for(i=2;i<=M;i++)
if(r[i]>emax)
{
emax=r[i];
eindex=i;
}
delete []r;
}
if(exemplar==NULL)return pindex;
else
{
if(pmax>emax)return pindex;
else
{
ExemNode *p=exemplar;
for(i=1;i<eindex;i++)
p=p->next;
return p->classnum;
}
}
delete []s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -