📄 ho-kashyap.cpp
字号:
// Ho-Kashyap.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Matrix.h"
#include <iostream>
#include <iomanip>
#define N 4 // 模式数目
#define n 2 // 模式维数,在算法中常见为n+1,经历了模式增广
inline Matrix Pinv(const Matrix A); // 求矩阵的伪逆
bool LessThan0(const Matrix A); // 判断是否矩阵有元素均小于等于0
Matrix Abs(const Matrix A); // 将矩阵的每一元素均取绝对值
/*************************************************************
// fuction name: _tmain
// description: 控制台主函数
该函数是 Ho-Kashyap 算法的具体实现
// 注:本算法的实现使用的下载的矩阵类 Matrix ,其中包括了矩阵的大部分操作。
*************************************************************/
int _tmain(int argc, _TCHAR* argv[])
{
// 变量声明
Matrix X(N, n+1); // 模式的增广矩阵 N*(n+1)维
Matrix Xplus(n+1, N); // 伪逆矩阵 (n+1)*N维
Matrix b(N, 1); // 余量矢量b N 维
double rho = 1.0; // 常熟rho 数值
int k = 0; // 步数 数值
Matrix w(n+1, 1); // 解向量w n+1维
Matrix e(N, 1); // 误差矢量 N维
// step1:
double x[N][n+1] = {
0, 0, 1,
0, 1, 1,
-1, 0, -1,
-1, -1, -1};
X = Matrix(&x[0][0], &x[N-1][n], N, n+1);
Xplus = Pinv(X);
// 条件输出
cout << endl << endl;
cout << "****************** Ho-Kashyap 算法演示程序 **************************" << endl << endl;
cout << "该演示程序模式增广矩阵为:" << endl;
cout << setprecision(2);
cout << setiosflags(ios::fixed);
for(int i=0;i<N;i++)
{
cout << "\t[";
for(int j =0;j<n;j++)
cout << setw(5) << x[i][j] << ", ";
cout << setw(5) << x[i][n] << "]" << endl;
}
{
int r = Xplus.Row(), c = Xplus.Col();
cout << endl << "伪逆矩阵为:" << endl;
for(int i=0;i<r;i++)
{
cout << "\t[";
for(int j=0;j<c-1;j++)
cout << setw(5) << Xplus[i][j] << ", ";
cout << setw(5) << Xplus[i][n] << "]" << endl;
}
}
// step2:
b = Matrix(N, 1, 1.0); // 取b(0) = (1,1,1)'
rho = 1.0; // 取rho = 1.0
k = 0; // 步数
w = Xplus * b;
bool keep = true; // 循环标识
do
{
// step3:
e = X * w - b;
// step4:
if(!LessThan0(e)) // e(k) !<= 0 goto step5
{
// step5:
w = w + rho * Xplus * Abs(e);
b = b + rho * (e + Abs(e));
}
else // e(k) = 0 或负的分量停止变为正值或各分量均为负值,停止。
keep = false;
// step6:
k++;
}while(keep);
// 输出结果
bool first = false;
cout << endl << "经过" << k << "次迭代,得判别界面为:" << endl;
cout << "\td(x) =";
for (int i=0;i<n+1;i++)
if(w[i][0] != 0)
{
if(first)
if(w[i][0] > 0)
cout << " + " << w[i][0];
else
cout << " - " << -w[i][0];
else
{
cout << " " << w[i][0];
first = true;
}
if(i < n)
cout << "x" << i+1;
}
cout << endl << endl << "*********感谢使用该 ISODATA 算法演示程序*******" << endl;
system("pause");
return 0;
}
/*************************************************************
// fuction name: Pinv
// description: 求矩阵的伪逆
// input variable: Matrix A
// output variable:Matrix 矩阵A的伪逆
*************************************************************/
Matrix Pinv(const Matrix A)
{
return ( A.Transpose() * A ).Converse() * A.Transpose();
}
/*************************************************************
// fuction name: LessThan0
// description: 判断是否矩阵有元素均小于等于0
// input variable: Matrix A
// output variable:bool,当矩阵A中有元素小于等于0时,返回true;矩阵A中元素均大于0时,返回false.
*************************************************************/
bool LessThan0(const Matrix A)
{
if(A.Col() != 1)
throw exception("this is no 1 dimension matrix.");
int k = A.Row();
bool b = false;
for(int i=0;i<k;i++)
{
if(A[i][0] <= 0)
b = true;
}
return b;
}
/*************************************************************
// fuction name: Abs
// description: 将矩阵的每一元素均取绝对值0
// input variable: Matrix A
// output variable:Matrix,返回将矩阵A的每一元素均取绝对值后的同维数矩阵。
*************************************************************/
Matrix Abs(const Matrix A)
{
Matrix B(A.Col(), A.Row());
for (int i=0; i<A.Row(); i++)
for (int j=0; j<A.Col(); j++)
B[i][j] = abs(A[i][j]);
return B;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -