📄 algorithm.cpp
字号:
// Algorithm.cpp: implementation of the CAlgorithm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HK.h"
#include "Algorithm.h"
#include "iostream.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAlgorithm::CAlgorithm()
{
}
CAlgorithm::~CAlgorithm()
{
}
void CAlgorithm::Process()//算法流程
{
//确定模式数目
cout<<"请输入第一类模式个数:";
cin>>patnum1;
cout<<"请输入第二类模式个数:";
cin>>patnum2;
// cout<<endl;
//输入模式向量并将模式符号规范化生成增广模式矩阵
int dim=patnum1+patnum2;
X.SetSize(dim,3);
cout<<"请输入第一类模式:";//<<endl;
for(int i=1;i<=patnum1;i++)
{
cin>>X(i,1)>>X(i,2);
X(i,3)=1;
}
// cout<<endl;
cout<<"请输入第二类模式:";//<<endl;
for(i=patnum1+1;i<=dim;i++)
{
cin>>X(i,1)>>X(i,2);
X(i,1)=-X(i,1);
X(i,2)=-X(i,2);
X(i,3)=-1;
}
cout<<"X 矩阵:"<<endl;
X.Display();
X_i.SetSize(3,dim);
b.SetSize(dim,1);
w.SetSize(dim,1);
//计算伪逆矩阵
X_i=!(~X*X)*~X;
cout<<"X伪逆矩阵:"<<endl;
X_i.Display();
//赋b(0)初始值
for(i=1;i<=dim;i++)
{
b(i,1)=1;
}
p=1;
k=0;
CMatrix e_old(dim,1);
CMatrix comp(dim,1);
CMatrix temp(dim,1);
bool count;
//开始循环
while(1)
{
//计算w,e
w=X_i*b;
e=X*w-b;
cout<<"e 误差矩阵:"<<endl;
e.Display();
if(e==comp)//判断误差为零,退出循环
break;
if(e<comp)//判断误差全为负,退出循环
break;
count=0;
for(int i=1;i<=dim;i++)
{
if(e_old(i,1)<0)
if(e(i,1)<0)
count=1;
else count=0;
}
if(count==1)
break;
//判断负值停止变化,退出循环
e_old=e;
// cout<<"test e"<<endl;
// e.Display();
//修正w,b
w=w+p*X_i*(e+Abs(e));
// cout<<"test e"<<endl;
// Abs(e).Display();
cout<<"w:"<<endl;
w.Display();
b=b+p*(e+Abs(e));
k++;
}
//显示w
cout<<"w向量:"<<endl;
w.Display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -