
Для реализации работы нейронной сети необходимо подготовить базу для работы с матрицами и векторами. Естесственно во многих средах программирования уже есть соответствующие классы. Но мы Не будем лезть в дебри и создадим свои классы, имеющие необходимые функции.
Matrix.h #include "stdafx.h" #pragma once templateclass Vector; // Begining of Matrix!!! #include "stdafx.h" #include template class Matrix { int stroka,stolbec; T**mat; public: int getStroka(); //возвращает число строк int getStolbec(); //возвращает число столбцов void SS(int,int); //переопределяет число строк и столбцов в матрице, //инициализирует матрицу нулями void Freemem(int); // освобождениме памяти void RandomInit(); // инициализирует матрицу случайными значениями от 0 до 1 void Init(); // ручной ввод значений элементов матрицы void Print(); // вывод матрицы на экран void Transpon(); // транспонирование void toEMatrix(); // переводит матрицу в еденичную (при stroka=stolbec) void setIJ(int,int,T); // ввод ij элемента матрицы void FermiInit(Vector ,double,double); // инициализация функцией Ферми T getIJ(int,int); // возвращает ij элемент T*operator[](int); Matrix &operator*(T); Matrix &operator*(Matrix &); Matrix &operator=(Matrix &); Matrix &operator+(Matrix &); Matrix &operator-(Matrix &); Matrix (); Matrix (int,int); ~Matrix (); }; // Matrix.cpp template Matrix ::Matrix() { this->stroka=1; this->stolbec=1; mat=new T*[1]; mat[0]=new T[1]; mat[0][0]=0; } template Matrix ::Matrix(int a,int b) { this->stroka=a; this->stolbec=b; mat=new T*[a]; for(int i=0;i Matrix ::~Matrix() { for(int i=0;i void Matrix ::SS(int a,int b) { for(int i=0;i stroka=a; this->stolbec=b; mat=new T*[a]; for(int i=0;i void Matrix ::setIJ(int i,int j,T e) { mat[i][j]=e; } template T Matrix ::getIJ(int i,int j) { return mat[i][j]; } template void Matrix ::Init() { cout<<"Enter elements of Matrix:"< stroka;i++) { for(int j=0;j stolbec;j++) { cout<<"Element of ["<>this->mat[i][j]; } cout< void Matrix ::RandomInit() { float z=100; double tmp; for(int i=0;i stroka;i++) { for(int j=0;j stolbec;j++) { tmp=(rand()%100)/z; if(tmp==0) tmp=0.01; this->mat[i][j]=tmp; } } } template void Matrix ::Print() { cout<<"Matrix is:\n"; for(int i=0;i stroka;i++) { for(int j=0;j stolbec;j++) cout<<"\t"< mat[i][j]; cout< void Matrix ::toEMatrix() { if(this->stroka!=this->stolbec) cout<<"Can not convert matrix to EMatrix!\n"; else { for(int i=0;i stroka;i++) { for(int j=0;j stolbec;j++) { if(i==j) this->mat[i][j]=1; else this->mat[i][j]=0; } } } } template void Matrix ::Transpon() { T**tmp=new T*[stolbec]; for(int i=0;i int Matrix ::getStroka() { return stroka; } template void Matrix ::FermiInit(Vector v,double alpha, double beta) { for(int i=0;i int Matrix ::getStolbec() { return stolbec; } template void Matrix ::Freemem(int n) { for(int i=0;i T*Matrix ::operator[](int idx) { return mat[idx]; } template Matrix &Matrix ::operator=(Matrix &b) { for(int i=0;i stroka=b.stroka; this->stolbec=b.stolbec; mat=new T*[stroka]; for(int i=0;i Matrix &Matrix ::operator+(Matrix &b) { Matrix*tmp=new Matrix(b.stroka,b.stolbec); if(this->stolbec!=b.stolbec||this->stroka!=b.stroka) { cout<<"Error! '+' is bad operation for Matrixs!\n"; return*tmp; } for(int i=0;i Matrix &Matrix ::operator-(Matrix &b) { Matrix*tmp=new Matrix(b.stroka,b.stolbec); if(this->stolbec!=b.stolbec||this->stroka!=b.stroka) { cout<<"Error! '-' is bad operation for Matrix!\n"; return*tmp; } for(int i=0;i Matrix &Matrix ::operator*(Matrix &b) { Matrix*tmp=new Matrix(this->stroka,b.stolbec); if(this->stolbec!=b.stroka) { cout<<"Error! '*' is bad operation for Matrix!\n"; return*tmp; } for(int i=0;i stroka;i++) for(int j=0;j Matrix &Matrix ::operator*(T b) { Matrix*tmp=new Matrix(this->stroka,this->stolbec); for(int i=0;i stroka;i++) for(int j=0;j stolbec;j++) (*tmp)[i][j]=(*this)[i][j]*b; return*tmp; }