⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ho-kashyap.cpp

📁 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 + -