📄 dlg_3c.cpp
字号:
// DLG_3C.cpp : implementation file
//
#include "stdafx.h"
#include "第一次作业.h"
#include "DLG_3C.h"
#include "DLG_SORT3.h""
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DLG_3C dialog
DLG_3C::DLG_3C(CWnd* pParent /*=NULL*/)
: CDialog(DLG_3C::IDD, pParent)
{
have_check=true;
//{{AFX_DATA_INIT(DLG_3C)
x1 =-2;
x2 =2;
w1_x11 = 0;
w1_x12 = 2;
w1_x13 = 1;
w1_x21 = 0;
w1_x22 = 1;
w1_x23 = 0;
w2_x11 = -1;
w2_x12 = -2;;
w2_x13 = -2;
w2_x21 = 1;
w2_x22 = 0;
w2_x23 = -1;
w3_x11 = 0;
w3_x12 = 0;
w3_x13 = 1;
w3_x21 = -2;
w3_x22 = -1;
w3_x23 = -2;
g_x1 = 0.0f;
g_x2 = 0.0f;
g_x3 = 0.0f;
Gx1 = _T("");
Gx2 = _T("");
Gx3 = _T("");
m_Radio1 = 0;
/*
x1 =0;
x2 =0;
w1_x11 = 0;
w1_x12 = 1;
w1_x13 = 2;
w1_x21 = 0.57735;
w1_x22 = -1.1547;
w1_x23 = 0.57735;
w2_x11 = -2;
w2_x12 = -1;;
w2_x13 = -2;
w2_x21 = 1;
w2_x22 = 0;
w2_x23 = -1;
w3_x11 = 0;
w3_x12 = 1;
w3_x13 = -1;
w3_x21 = -1;
w3_x22 = -2;
w3_x23 = -2;
*/
//}}AFX_DATA_INIT
}
void DLG_3C::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DLG_3C)
DDX_Control(pDX, IDC_RADIO_IS, m_CtrRadio1);
DDX_Control(pDX, IDC_RADIO_NOT, m_CtrRadio2);
DDX_Text(pDX, IDC_EDIT_ResultClass, Result_Class);
DDX_Text(pDX, IDC_EDIT_3C_x1, x1);
DDX_Text(pDX, IDC_EDIT_3C_x2, x2);
DDX_Text(pDX, IDC_EDIT_3X111, w1_x11);
DDX_Text(pDX, IDC_EDIT_3X112, w1_x12);
DDX_Text(pDX, IDC_EDIT_3X113, w1_x13);
DDX_Text(pDX, IDC_EDIT_3X121, w1_x21);
DDX_Text(pDX, IDC_EDIT_3X122, w1_x22);
DDX_Text(pDX, IDC_EDIT_3X123, w1_x23);
DDX_Text(pDX, IDC_EDIT_3X211, w2_x11);
DDX_Text(pDX, IDC_EDIT_3X212, w2_x12);
DDX_Text(pDX, IDC_EDIT_3X213, w2_x13);
DDX_Text(pDX, IDC_EDIT_3X221, w2_x21);
DDX_Text(pDX, IDC_EDIT_3X222, w2_x22);
DDX_Text(pDX, IDC_EDIT_3X223, w2_x23);
DDX_Text(pDX, IDC_EDIT_3X311, w3_x11);
DDX_Text(pDX, IDC_EDIT_3X312, w3_x12);
DDX_Text(pDX, IDC_EDIT_3X313, w3_x13);
DDX_Text(pDX, IDC_EDIT_3X321, w3_x21);
DDX_Text(pDX, IDC_EDIT_3X322, w3_x22);
DDX_Text(pDX, IDC_EDIT_3X323, w3_x23);
DDX_Text(pDX, IDC_EDIT_gx1, g_x1);
DDX_Text(pDX, IDC_EDIT_gx2, g_x2);
DDX_Text(pDX, IDC_EDIT_gx3, g_x3);
DDX_Text(pDX, IDC_EDIT_SORT_Gx1, Gx1);
DDX_Text(pDX, IDC_EDIT_SORT_Gx2, Gx2);
DDX_Text(pDX, IDC_EDIT_SORT_Gx3, Gx3);
DDX_Radio(pDX, IDC_RADIO_IS, m_Radio1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DLG_3C, CDialog)
//{{AFX_MSG_MAP(DLG_3C)
ON_BN_CLICKED(IDC_RADIO_IS, OnRadioIs)
ON_BN_CLICKED(IDC_RADIO_NOT, OnRadioNot)
ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin)
ON_BN_CLICKED(IDC_BUTTON_3C_RESULT, OnButton3cResult)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLG_3C message handlers
void DLG_3C::OnRadioIs()
{
// TODO: Add your control notification handler code here
have_check=true;
m_CtrRadio1.SetCheck(true);
m_CtrRadio2.SetCheck(false);
}
void DLG_3C::OnRadioNot()
{
// TODO: Add your control notification handler code here
have_check=false;
m_CtrRadio2.SetCheck(true);
m_CtrRadio1.SetCheck(false);
}
void DLG_3C::OnButtonBegin()
{
// TODO: Add your control notification handler code here
int i,j;
UpdateData(true);//获取输入信息
//均值
Average_X1[0]=(w1_x11+w1_x12+w1_x13)/3;
Average_X1[1]=(w1_x21+w1_x22+w1_x23)/3;
Average_X2[0]=(w2_x11+w2_x12+w2_x13)/3;
Average_X2[1]=(w2_x21+w2_x22+w2_x23)/3;
Average_X3[0]=(w3_x11+w3_x12+w3_x13)/3;
Average_X3[1]=(w3_x21+w3_x22+w3_x23)/3;
//协方差矩阵
E1[0]=(pow(w1_x11-Average_X1[0],2)
+pow(w1_x12-Average_X1[0],2)
+pow(w1_x13-Average_X1[0],2))/2;
E1[1]=E1[2]=((w1_x11-Average_X1[0])*(w1_x21-Average_X1[1])
+(w1_x12-Average_X1[0])*(w1_x22-Average_X1[1])
+(w1_x13-Average_X1[0])*(w1_x23-Average_X1[1]))/2;
E1[3]=(pow(w1_x21-Average_X1[1],2)
+pow(w1_x22-Average_X1[1],2)
+pow(w1_x23-Average_X1[1],2))/2;
E2[0]=(pow(w2_x11-Average_X2[0],2)
+pow(w2_x12-Average_X2[0],2)
+pow(w2_x13-Average_X2[0],2))/2;
E2[1]=E2[2]=((w2_x11-Average_X2[0])*(w2_x21-Average_X2[1])
+(w2_x12-Average_X2[0])*(w2_x22-Average_X2[1])
+(w2_x13-Average_X2[0])*(w2_x23-Average_X2[1]))/2;
E2[3]=(pow(w2_x21-Average_X2[1],2)
+pow(w2_x22-Average_X2[1],2)
+pow(w2_x23-Average_X2[1],2))/2;
E3[0]=(pow(w3_x11-Average_X3[0],2)
+pow(w3_x12-Average_X3[0],2)
+pow(w3_x13-Average_X3[0],2))/2;
E3[1]=E3[2]=((w3_x11-Average_X3[0])*(w3_x21-Average_X3[1])
+(w3_x12-Average_X3[0])*(w3_x22-Average_X3[1])
+(w3_x13-Average_X3[0])*(w3_x23-Average_X3[1]))/2;
E3[3]=(pow(w3_x21-Average_X3[1],2)
+pow(w3_x22-Average_X3[1],2)
+pow(w3_x23-Average_X3[1],2))/2;
//协方差矩阵行列式值
abs_E1=E1[0]*E1[3]-E1[1]*E1[2];
abs_E2=E2[0]*E2[3]-E2[1]*E2[2];
abs_E3=E3[0]*E3[3]-E3[1]*E3[2];
if(abs_E1==0)
{
AfxMessageBox("协方差∑1的行列式值为0,不能对矩阵求逆。请重新输入!");
return;
}
if(abs_E2==0)
{
AfxMessageBox("协方差∑2的行列式值为0,不能对矩阵求逆。请重新输入!");
return;
}
if(abs_E3==0)
{
AfxMessageBox("协方差∑3的行列式值为0,不能对矩阵求逆。请重新输入!");
return;
}
//后验概率
P1=P2=P3=1.0/3;
//待定样本
X[0]=x1;
X[1]=x2;
if(have_check)
{
//求协方差矩阵的逆矩阵
Inv(E1,2);
Inv(E2,2);
Inv(E3,2);
for( i=0;i<4;i++)//计算计算Wi
{
W1[i]=0-E1[i]/2;
W2[i]=0-E2[i]/2;
W3[i]=0-E3[i]/2;
}
//计算系数
a[0][0]=W1[0];
a[0][1]=W1[3];
a[0][2]=E1[0]*Average_X1[0]+E1[1]*Average_X1[1];
a[0][3]=E1[2]*Average_X1[0]+E1[3]*Average_X1[1];
a[0][4]=W1[1]+W1[2];
a[0][5]=0-(E1[0]*pow(Average_X1[0],2)+(E1[1]+E1[2])*Average_X1[0]*Average_X1[1]+E1[3]*pow(Average_X1[1],2))/2-log(abs_E1)/2+log(P1);
g_x1=a[0][0]*x1*x1+a[0][1]*x2*x2+a[0][2]*x1+a[0][3]*x2+a[0][4]*x1*x2+a[0][5];
a[1][0]=W2[0];
a[1][1]=W2[3];
a[1][2]=E2[0]*Average_X2[0]+E2[1]*Average_X2[1];
a[1][3]=E2[2]*Average_X2[0]+E2[3]*Average_X2[1];
a[1][4]=W2[1]+W2[2];
a[1][5]=0-(E2[0]*pow(Average_X2[0],2)+(E2[1]+E2[2])*Average_X2[0]*Average_X2[1]+E2[3]*pow(Average_X2[1],2))/2-log(abs_E2)/2+log(P2);
g_x2=a[1][0]*x1*x1+a[1][1]*x2*x2+a[1][2]*x1+a[1][3]*x2+a[1][4]*x1*x2+a[1][5];
a[2][0]=W3[0];
a[2][1]=W3[3];
a[2][2]=E3[0]*Average_X3[0]+E3[1]*Average_X3[1];
a[2][3]=E3[2]*Average_X3[0]+E3[3]*Average_X3[1];
a[2][4]=W3[1]+W3[2];
a[2][5]=0-(E3[0]*pow(Average_X3[0],2)+(E3[1]+E3[2])*Average_X3[0]*Average_X3[1]+E3[3]*pow(Average_X3[1],2))/2-log(abs_E3)/2+log(P3);
g_x3=a[2][0]*x1*x1+a[2][1]*x2*x2+a[2][2]*x1+a[2][3]*x2+a[2][4]*x1*x2+a[2][5];
//输出结果
if(g_x1>g_x2&&g_x1>g_x3)
Result_Class="ω1类";
else if(g_x2>g_x1&&g_x2>g_x3)
Result_Class="ω2类";
else if(g_x3>g_x1&&g_x3>g_x1)
Result_Class="ω3类";
else
Result_Class="未知";
}
else
{
for(i=0;i<4;i++)
E[i]=E1[i]+E2[i]+E3[i];
Inv(E1,2);
Inv(E2,2);
Inv(E3,2);
Inv(E,2);
for(i=0;i<3;i++)
for(j=0;j<6;j++)
a[i][j]=0;
a[0][2]=E[0]*Average_X1[0];
a[0][3]=E[3]*Average_X1[1];
a[0][5]=-(E[0]*pow(Average_X1[0],2)+(E[1]+E[2])*Average_X1[0]*Average_X1[1]+E[3]*pow(Average_X1[1],2))/2+log(P1);
a[1][2]=E[0]*Average_X2[0];
a[1][3]=E[3]*Average_X2[1];
a[1][5]=-(E[0]*pow(Average_X2[0],2)+(E[1]+E[2])*Average_X2[0]*Average_X2[1]+E[3]*pow(Average_X2[1],2))/2+log(P2);
a[2][2]=E[0]*Average_X3[0];
a[2][3]=E[3]*Average_X3[1];
a[2][5]=-(E[0]*pow(Average_X3[0],2)+(E[1]+E[2])*Average_X3[0]*Average_X3[1]+E[3]*pow(Average_X3[1],2))/2+log(P3);
g_x1=a[0][2]*x1+a[0][3]*x2+a[0][5];
g_x2=a[1][2]*x1+a[1][3]*x2+a[1][5];
g_x3=a[2][2]*x1+a[2][3]*x2+a[2][5];
if((g_x1>g_x2)&&(g_x1>g_x3))
Result_Class="ω1类";
else if((g_x2>g_x1)&&(g_x2>g_x3))
Result_Class="ω2类";
else if((g_x3>g_x1)&&(g_x3>g_x1))
Result_Class="ω3类";
else
Result_Class="未知";
}
//用字符串记住各项的系数
for(j=0;j<6;j++)
{
gcvt(a[0][j],4,ch1[j]);
str[0][j].Format(_T("%s"), ch1[j]);
}
for(j=0;j<6;j++)
{
gcvt(a[1][j],4,ch2[j]);
str[1][j].Format(_T("%s"), ch2[j]);
}
for(j=0;j<6;j++)
{
gcvt(a[2][j],4,ch3[j]);
str[2][j].Format(_T("%s"), ch3[j]);
}
//输出分界函数
for(i=0;i<3;i++)
{
if(a[i][1]==0)s[0]=str[i][0]="";
else s[0]="*X1*X1+";
if(a[i][1]==0)s[1]=str[i][1]="";
else s[1]="*X2*X2+";
if(a[i][2]==0)s[2]=str[i][2]="";
else s[2]="*X1+";
if(a[i][3]==0)s[3]=str[i][3]="";
else s[3]="*X2+";
if(a[i][4]==0)s[4]=str[i][4]="";
else s[4]="*X1*X2+";
if(i==0)
Gx1=str[0][0]+s[0]+ str[0][1]+s[1] +str[0][2]+s[2] +str[0][3]+s[3] +str[0][4]+s[4] +str[0][5];
else if(i==1)
Gx2=str[1][0]+s[0]+ str[1][1]+s[1] +str[1][2]+s[2] +str[1][3]+s[3] +str[1][4]+s[4] +str[1][5];
else if(i==2)
Gx3=str[2][0]+s[0]+ str[2][1]+s[1] +str[2][2]+s[2] +str[2][3]+s[3] +str[2][4]+s[4] +str[2][5];
}
UpdateData(false);
}
void DLG_3C::Inv(float *a, int n)//矩阵求逆
{
int i,j,k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
if(i!=k)
*(a+i*n+k)=-*(a+i*n+k)/(*(a+k*n+k));
}
*(a+k*n+k)=1/(*(a+k*n+k));
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=0;j<n;j++)
{
if(j!=k)
*(a+i*n+j)+=*(a+k*n+j)* *(a+i*n+k);
}
}
}
for(j=0;j<n;j++)
{
if(j!=k)
*(a+k*n+j)*=*(a+k*n+k);
}
}
}
void DLG_3C::OnButton3cResult()
{
// TODO: Add your control notification handler code here
DLG_SORT3 dlg;
for(int i=0;i<3;i++)
for(int j=0;j<6;j++)
{
dlg.a[i][j]=a[i][j];
}
dlg.Gx1=g_x1;
dlg.Gx2=g_x2;
dlg.Gx3=g_x3;
dlg.m_Result=Result_Class;
dlg.DoModal();
UpdateData(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -