📄 dlg_2c.cpp
字号:
// DLG_2C.cpp : implementation file
//
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "第一次作业.h"
#include "DLG_2C.h"
#include "math.h"
#include "DLG_SORT.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DLG_2C dialog
DLG_2C::DLG_2C(CWnd* pParent /*=NULL*/)
: CDialog(DLG_2C::IDD, pParent)
{
have_check=true;
//{{AFX_DATA_INIT(DLG_2C)
g_x = 0.0f;
Result_Class = _T("");
Result_Gx = _T("");
x1 = 2;
x2 = 0;
w1_x11 = 1;
w1_x12 = 1;
w1_x13 = 2;
w1_x21 = 1;
w1_x22 = 0;
w1_x23 = -1;
w2_x11 = -1;
w2_x12 = -1;
w2_x13 = -2;
w2_x21 = 1;
w2_x22 = 0;
w2_x23 = -1;
m_Radio1 = 0;
//}}AFX_DATA_INIT
}
void DLG_2C::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DLG_2C)
DDX_Control(pDX, IDC_RADIO_IS, m_CtrRadio1);
DDX_Control(pDX, IDC_RADIO_NOT, m_CtrRadio2);
DDX_Text(pDX, IDC_EDIT1_gx, g_x);
DDX_Text(pDX, IDC_EDIT1_ResultClass, Result_Class);
DDX_Text(pDX, IDC_EDIT_ResultGx, Result_Gx);
DDX_Text(pDX, IDC_EDIT1_x1, x1);
DDV_MinMaxFloat(pDX, x1, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT1_x2, x2);
DDV_MinMaxFloat(pDX, x2, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X112, w1_x12);
DDV_MinMaxFloat(pDX, w1_x12, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X113, w1_x13);
DDV_MinMaxFloat(pDX, w1_x13, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X121, w1_x21);
DDV_MinMaxFloat(pDX, w1_x21, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X122, w1_x22);
DDX_Text(pDX, IDC_EDIT_X123, w1_x23);
DDV_MinMaxFloat(pDX, w1_x23, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X211, w2_x11);
DDV_MinMaxFloat(pDX, w2_x11, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X212, w2_x12);
DDV_MinMaxFloat(pDX, w2_x12, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X213, w2_x13);
DDV_MinMaxFloat(pDX, w2_x13, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X221, w2_x21);
DDV_MinMaxFloat(pDX, w2_x21, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X222, w2_x22);
DDV_MinMaxFloat(pDX, w2_x22, -10.f, 10.f);
DDX_Text(pDX, IDC_EDIT_X223, w2_x23);
DDV_MinMaxFloat(pDX, w2_x23, -10.f, 10.f);
DDX_Radio(pDX, IDC_RADIO_IS, m_Radio1);
DDX_Text(pDX, IDC_EDIT_X111, w1_x11);
DDV_MinMaxDouble(pDX, w1_x11, -10., 10.);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DLG_2C, CDialog)
//{{AFX_MSG_MAP(DLG_2C)
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_RESULT, OnButtonResult)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DLG_2C message handlers
void DLG_2C::OnRadioIs()
{
// TODO: Add your control notification handler code here
have_check=true;
m_CtrRadio1.SetCheck(true);
m_CtrRadio2.SetCheck(false);
}
void DLG_2C::OnRadioNot()
{
// TODO: Add your control notification handler code here
have_check=false;
m_CtrRadio2.SetCheck(true);
m_CtrRadio1.SetCheck(false);
}
void DLG_2C::OnButtonBegin()
{
// TODO: Add your control notification handler code here
int i;
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;
//协方差矩阵
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;
//协方差矩阵行列式值
abs_E1=E1[0]*E1[3]-E1[1]*E1[2];
abs_E2=E2[0]*E2[3]-E2[1]*E2[2];
if(abs_E1==0)
{
AfxMessageBox("协方差∑1的行列式值为0,不能对矩阵求逆。请重新输入!");
return;
}
if(abs_E2==0)
{
AfxMessageBox("协方差∑2的行列式值为0,不能对矩阵求逆。请重新输入!");
return;
}
//后验概率
P1=P2=0.5;
Ln_P=0;
Ln_E=log(abs_E1/abs_E2);
//待定样本
X[0]=x1;
X[1]=x2;
//如果协方差不相等
if(have_check)
{
//协方差矩阵求逆
Inv(E1,2);
Inv(E2,2);
a1[0]=E1[0];//X1平方的系数
a1[1]=E1[3];//X2平方的系数
a1[2]=0-(2*E1[0]*Average_X1[0]+E1[2]*Average_X1[1]+E1[0]*Average_X1[1]);//X1的系数
a1[3]=0-(E1[2]*Average_X1[0]+E1[1]*Average_X1[0]+2*E1[3]*Average_X1[1]);//X2的系数
a1[4]=(E1[1]+E1[2]);//X1*X2的系数
a1[5]=E1[0]*pow(Average_X1[0],2)+(E1[1]+E1[2])*Average_X1[0]*Average_X1[1]+E1[3]*pow(Average_X1[1],2);//常数项
a2[0]=E2[0];//X1平方的系数
a2[1]=E2[3];//X2平方的系数
a2[2]=0-(2*E2[0]*Average_X2[0]+E2[2]*Average_X2[1]+E2[0]*Average_X2[1]);//X1的系数
a2[3]=0-(E2[2]*Average_X2[0]+E2[1]*Average_X2[0]+2*E2[3]*Average_X2[1]);//X2的系数
a2[4]=(E2[1]+E2[2]);//X1*X2的系数
a2[5]=E2[0]*pow(Average_X2[0],2)+(E2[1]+E2[2])*Average_X2[0]*Average_X2[1]+E2[3]*pow(Average_X2[1],2);//常数项
//最后结果
for(i=0;i<5;i++)
a2[i]=(a1[i]-a2[i])/2;
a2[5]=(a1[5]-a2[5])/2+Ln_E/2-Ln_P;//常数项
//分类结果
if(g_x<0)
Result_Class="ω1类";
else if(g_x>0)
Result_Class="ω2类";
else
Result_Class="未知";
}
else
{
for(i=0;i<6;i++)
a1[i]=a2[i]=0;
for(i=0;i<4;i++)
E[i]=E1[i]+E2[i];
//协方差矩阵求逆
Inv(E1,2);
Inv(E2,2);
Inv(E,2);
for(i=0;i<2;i++)
X2_X1[i]=Average_X2[i]-Average_X1[i];
//计算系数
a2[2]=a1[2]=X2_X1[0]*E[0]+X2_X1[1]*E[2];//x1的系数
a2[3]=a1[3]=X2_X1[0]*E[1]+X2_X1[1]*E[3];//x2的系数
a1[5]=E[0]*pow(Average_X1[0],2)+(E[1]+E[2])*Average_X1[0]*Average_X1[1]+E[3]*Average_X1[1];
a2[5]=E[0]*pow(Average_X2[0],2)+(E[1]+E[2])*Average_X2[0]*Average_X2[1]+E[3]*Average_X2[1];
a2[5]=(a1[5]-a2[5])/2-Ln_P;//常数项
//显示结果
if(g_x<0)
Result_Class="ω1类";
else if(g_x>0)
Result_Class="ω2类";
else
Result_Class="ω1或ω2类";
}
//结果
g_x=a2[0]*x1*x1+a2[1]*x2*x2+a2[2]*x1+a2[3]*x2+a2[4]*x1*x2+a2[5];
//显示分界函数
for(i=0;i<6;i++)
{
gcvt(a2[i],4,ch[i]);
a[i].Format(_T("%s"), ch[i]); //X1平方的系数
}
if(a2[0]==0)a[0]=s1[0]="";
else s1[0]="*X1*X1+";
if(a2[1]==0)a[1]=s1[1]="";
else s1[1]="*X2*X2+";
if(a2[2]==0)a[2]=s1[2]="";
else s1[2]="*X1+";
if(a2[3]==0)a[3]=s1[3]="";
else s1[3]="*X2+";
if(a2[4]==0)a[4]=s1[4]="";
else s1[4]="*X1*X2+";
if(a2[5]==0)a[5]="0";
Result_Gx=a[0]+s1[0]+a[1]+s1[1]+a[2]+s1[2]+a[3]+s1[3]+a[4]+s1[4]+a[5]+s1[5];
UpdateData(false);
}
void DLG_2C::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_2C::OnButtonResult()
{
// TODO: Add your control notification handler code here
DLG_SORT dlg;
for(int i=0;i<6;i++)
dlg.a[i]=a2[i];//各项系数
dlg.m_Gx=Result_Class;
dlg.G_X="g(x)="+Result_Gx+"=0";
UpdateData(true);
dlg.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -