Рекурсивный алгоритм распознавания образов, страница 3

P=new float[StrToInt(ENClas->Text)+1];

M=new float*[StrToInt(ENClas->Text)+1];

L=new float*[StrToInt(ENPer->Text)+1];

g=new float*[StrToInt(ENClas->Text)+1];

for (j=0;j<StrToInt(ENClas->Text)+1;j++)

{

M[j] = new float[StrToInt(ENPer->Text)+1];

g[j] = new float[StrToInt(ENPer->Text)+1];

}

for (j=0;j<StrToInt(ENPer->Text)+1;j++)

L[j] = new float[StrToInt(ENPer->Text)+1];

//Считаю P(s) и M(s,Per)

for(i=1;i<=StrToInt(ENClas->Text);i++)

{

sum=0;

per=i;

for(j=1;j<=StrToInt(ENNab->Text);j++)

{

if(Data[j*(StrToInt(ENPer->Text)+1)]==per) sum=sum+1;

}

P[i]=sum/StrToInt(ENNab->Text);

for(j=1;j<=StrToInt(ENPer->Text);j++)

{

sum1=0;

for(k=1;k<=StrToInt(ENNab->Text);k++)

if(Data[k*(StrToInt(ENPer->Text)+1)]==per)

sum1=sum1+Data[(k-1)*(StrToInt(ENPer->Text)+1)+j];

M[i][j]=sum1/sum;

}

}

//Считаю L

for(i=1;i<=StrToInt(ENPer->Text);i++)

{

for(j=1;j<=StrToInt(ENPer->Text);j++)

{

sum=0;

for(k=1;k<=StrToInt(ENClas->Text);k++)

{

per=k;

for(l=1;l<=StrToInt(ENNab->Text);l++)

{

if(Data[l*(StrToInt(ENPer->Text)+1)]==per)

sum=sum+(Data[(l-1)*(StrToInt(ENPer->Text)+1)+i]-M[k][i])*

(Data[(l-1)*(StrToInt(ENPer->Text)+1)+j]-M[k][j]);

}

}

L[i][j]=sum/(StrToInt(ENNab->Text));

}

}

//Считаю g

float **L1;

float *vec;

float det;

L1=new float*[StrToInt(ENPer->Text)+1];

vec=new float[StrToInt(ENPer->Text)+1];

for (j=0;j<StrToInt(ENPer->Text)+1;j++)

L1[j] = new float[StrToInt(ENPer->Text)+1];

if(StrToInt(ENPer->Text)==1)

{

if(L[1][1]!=0)

{

L1[1][1]=1/L[1][1];

}

else ShowMessage(AnsiString("L1 не существует!!!"));

}

else

if(StrToInt(ENPer->Text)==2)

{

det=L[1][1]*L[2][2]-L[2][1]*L[1][2];

if(det != 0)

{

L1[1][1]=L[2][2]/det;

L1[2][2]=L[1][1]/det;

L1[1][2]=-L[1][2]/det;

L1[2][1]=-L[2][1]/det;

}

else ShowMessage(AnsiString("L1 не существует!!!"));

}

else

if(StrToInt(ENPer->Text)==3)

{

det=L[1][1]*L[2][2]*L[3][3]+L[1][2]*L[2][3]*L[3][1]+L[3][1]*L[2][3]*L[1][2]-L[3][1]*L[2][2]*L[1][3]-L[1][2]*L[2][1]*L[3][3]-L[1][1]*L[2][3]*L[3][2];

if(det != 0)

{

L1[1][1]= (L[2][2]*L[3][3]-L[2][3]*L[3][2])/det;

L1[2][1]=-(L[2][1]*L[3][3]-L[2][3]*L[3][1])/det;

L1[3][1]= (L[2][1]*L[3][2]-L[2][2]*L[3][1])/det;

L1[1][2]=-(L[1][2]*L[3][3]-L[1][3]*L[3][2])/det;

L1[2][2]= (L[1][1]*L[3][3]-L[1][3]*L[3][1])/det;

L1[3][2]=-(L[1][1]*L[3][2]-L[1][2]*L[3][1])/det;

L1[1][3]= (L[1][2]*L[2][3]-L[1][3]*L[2][2])/det;

L1[2][3]=-(L[1][1]*L[2][3]-L[1][3]*L[2][1])/det;

L1[3][3]= (L[1][1]*L[2][2]-L[1][2]*L[2][1])/det;

}

else ShowMessage(AnsiString("L1 не существует!!!"));

}

else

ShowMessage(AnsiString("Не могу найти матрицу L-1 !!!"));

//Поиск g

for(i=1;i<=StrToInt(ENClas->Text);i++)

{

g[i][0]=log(P[i]);

sum1=0;

for(j=1;j<=StrToInt(ENPer->Text);j++)

{

sum=0;

for(k=1;k<=StrToInt(ENPer->Text);k++)

{

sum=sum+L1[j][k]*M[i][k];

}

g[i][j]=sum;

sum1=sum1-sum*M[i][j]/2;

}

g[i][0]=g[i][0]+sum1;

}

//Вывод результатов

AnsiString str;

str="P(s):";

for(i=1;i<=StrToInt(ENClas->Text);i++)

{

str=str+FloatToStrF(P[i],ffFixed,6,6)+" ";

if((str.Length()>55)&&(j<StrToInt(ENPer->Text)))

{

LBG->Items->Add(str);

str="    ";

}

}

LBG->Items->Add(str);

str="";

LBG->Items->Add(str);

for(i=1;i<=StrToInt(ENClas->Text);i++)

{

str="M("+IntToStr(i)+"): ";

for(j=1;j<=StrToInt(ENPer->Text);j++)

{

str=str+' '+FloatToStrF(M[i][j],ffFixed,6,6);

if((str.Length()>55)&&(j<StrToInt(ENPer->Text)))

{

LBG->Items->Add(str);

str="    ";

}

}

LBG->Items->Add(str);

}

str="";

LBG->Items->Add(str);

for(i=1;i<=StrToInt(ENPer->Text);i++)

{

str="L("+IntToStr(i)+"): ";

for(j=1;j<=StrToInt(ENPer->Text);j++)

{

str=str+' '+FloatToStrF(L[i][j],ffFixed,6,6);

if((str.Length()>55)&&(j<StrToInt(ENPer->Text)))

{

LBG->Items->Add(str);

str="    ";

}

}

LBG->Items->Add(str);

}

str="";

LBG->Items->Add(str);