📄 functions.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 + -