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

📄 functions.h

📁 BP网络解决异或问题的实例
💻 H
字号:

#include <iostream.h>
#include <iomanip.h>
#include <math.h>

double Sigmoid(double x)// 单极性S型函数
{
	return 1/(1+exp(-x));
}

double Derivative (double x)//单极性S型函数求导
{
	return (1-x)*x;
}

class CMatrix //定义矩阵类 
{

private:

	int m_iLine,m_iColumn;
	double* m_pNumber;

public:

	CMatrix();
	CMatrix(int lines,int columns);
	CMatrix(const CMatrix& m);
	virtual ~CMatrix();

	CMatrix SelectRow(int row,int index,int n);//从第index列开始取出第row行的n列
	CMatrix ColumnExpand();//在列向量后添加-1,便于阈值计算
	void SetLinesAndColumns(int line,int column);
	void zeros();
	CMatrix transp();//转置
	void SigmoidColumn();//激励函数
	void MultipleK(double k);//矩阵数乘
	CMatrix operator * (CMatrix m);
	CMatrix operator + (CMatrix m);
	const CMatrix operator = (CMatrix m);
	double& Set(int i,int j);
	double* Getp();
	void Print(int);//显示
};


CMatrix::CMatrix()
{
	m_iLine=m_iColumn=0;
	m_pNumber = NULL;
}


CMatrix::~CMatrix()
{
	if(m_pNumber)
	{
		delete []m_pNumber;
		m_pNumber = NULL;
	}
}


CMatrix::CMatrix(const CMatrix &m)//拷贝构造
{
	m_iLine = m.m_iLine;
	m_iColumn = m.m_iColumn;
	m_pNumber = new double[m_iLine*m_iColumn];
	for(int i=0;i<m_iLine*m_iColumn;i++)
		m_pNumber[i] = m.m_pNumber[i];
}


CMatrix::CMatrix(int lines, int columns)//按行数和列数构造矩阵,并初始化为零阵
{
	m_iLine = lines;
	m_iColumn = columns;
	m_pNumber = new double[m_iColumn*m_iLine];
	for(int i=0;i<m_iLine*m_iColumn;i++)
		m_pNumber[i] = 0;
}


double & CMatrix::Set(int i, int j)//矩阵指定元素
{
	return m_pNumber[i*m_iColumn+j];
}

double* CMatrix::Getp()
{
	return this->m_pNumber;
}

CMatrix CMatrix::operator *(CMatrix m)//矩阵乘法
{
	CMatrix temp;
	if(m_iColumn!=m.m_iLine)
		return temp;
	temp.SetLinesAndColumns(m_iLine,m.m_iColumn);
	temp.zeros();
	for(int i=0;i<m_iLine;i++)
		for(int j=0;j<temp.m_iColumn;j++)
		{
			for(int k=0;k<m_iColumn;k++)
				temp.Set(i,j) += m_pNumber[i*m_iColumn+k]*m.Set(k,j);
		}
	return temp;
}

void CMatrix::MultipleK(double k)//矩阵数乘
{
	for(int i=0;i<m_iLine*m_iColumn;i++)
			m_pNumber[i] *= k;
}

CMatrix CMatrix::operator +(CMatrix m) //矩阵加法
{
	if(m_iColumn!=m.m_iColumn&&m_iLine!=m.m_iLine)
		return *this;
	for(int i=0;i<m_iLine;i++)
		for(int j=0;j<m_iColumn;j++)
		{
			m_pNumber[i*m_iColumn+j] += m.Set(i,j);
		}
		return *this;
}

const CMatrix CMatrix::operator =(CMatrix m)
{
	if(m_iColumn!=m.m_iColumn&&m_iLine!=m.m_iLine)
		return *this;
	SetLinesAndColumns(m_iLine,m_iColumn);
	for(int i=0;i<m_iLine;i++)
		for(int j=0;j<m.m_iColumn;j++)
		{
				 m_pNumber[i*m_iColumn+j] = m.Set(i,j);
		}
	return *this;
}

void CMatrix::zeros()
{
	for(int i=0;i<m_iLine;i++)
		for(int j=0;j<m_iColumn;j++)
		{
			m_pNumber[i*m_iColumn+j] = 0;
		}
}

void CMatrix::SetLinesAndColumns(int line, int column)//重置行数和列数
{
	if(m_pNumber)
	{
		delete []m_pNumber;
		m_pNumber = NULL;
	}
	m_pNumber = new double[line*column];
	m_iLine = line;
	m_iColumn = column;
}


CMatrix CMatrix::transp()//矩阵转置
{
	CMatrix tempm;
	tempm.SetLinesAndColumns(m_iColumn,m_iLine);
	for(int i=0;i<m_iLine;i++)
		for(int j=0;j<m_iColumn;j++)
			tempm.Set(j,i) = m_pNumber[i*m_iColumn+j];	
	return tempm;
}

CMatrix CMatrix::SelectRow(int row,int index,int n)//从第index列开始取出第row行的n列,用于读取导师信号
{
	CMatrix Row(1,n);
	for(int i=0;i<n;i++)
		Row.m_pNumber[i] = this->m_pNumber[i+(row-1)*(this->m_iColumn)+(index-1)];
	return Row;

}

void CMatrix::SigmoidColumn()//激励函数运算
{

	for(int i=0;i<m_iLine;i++)
		m_pNumber[i] = Sigmoid(m_pNumber[i]);

}

CMatrix CMatrix::ColumnExpand()//在列向量后添加-1,用于阈值计算
{
		CMatrix Column(this->m_iLine+1,1);
		for(int i=0;i<this->m_iLine;i++)
			Column.m_pNumber[i] = this->m_pNumber[i];
		Column.m_pNumber[i] = -1;
		return Column;
}

void CMatrix::Print(int width=8)//矩阵输出
{
	for(int i=0;i<m_iLine;i++)
	{
		for(int j=0;j<m_iColumn;j++)
		{
			cout<<setw(width)<<m_pNumber[i*m_iColumn+j]<<'\t';
		}
		cout<<endl;
	}
	cout<<endl;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -