这是在做一个神经网络训练时候发现得一个矩阵类,做的很好,推荐给大家,原来的矩阵是从txt中加载数据,现在添加函数bool LoadDataFromBase(); 实现从数据库中添加数据

/
// Matrix.h :
//      Interface of the class CMatrix
// Author : freeia
// Modified Date : 3/11/2003
// E-mail : freeia@163.com
// Company/School : hdcad
/#ifndef _MATRIX_H
#define _MATRIX_H#include <vector>using namespace std;typedef vector <double> VDOUBLE;
typedef vector <VDOUBLE> TMatrix;class __declspec(dllexport) CMatrix
{   /*************************************************************************              the interface function of the class CMatrix             *************************************************************************/
public:/// Construction and Destruction CMatrix();CMatrix(CMatrix& cMatrixB);virtual ~CMatrix();TMatrix m_pTMatrix;             // 指向矩阵的头指针/// According to the parameters nRow & nCol to construct a matrixCMatrix(unsigned int nRow, unsigned int nCol);/// This function initialize the matrix ://       the matrix which has been initialized has 0 row & 0 column, and// all elements in it is zeros.// void Initialize();/// This function initialize the matrix ://      the matrix which has been initialized has 0 row & 0 column, and// all elements in it is zeros.// void InitializeZero();/// To make random in the elements of the matrix and the elements of the // matrix has been randomized between -1 and 1.These elements must be// decimal fractions.// void RandomInitialize();/// Overload Operations// 'CMatrix + CMatrix'CMatrix operator + (CMatrix& cMatrixB);   // 'CMatrix - CMatrix'CMatrix operator - (CMatrix& cMatrixB); // 'CMatrix * CMatrix'CMatrix operator * (CMatrix& cMatrixB); // 'CMatrix * double'CMatrix operator * (double nValue);  // 'CMatrix = CMatrix'CMatrix& operator = (CMatrix& cMatrixB);  // 'CMatrix += CMatrix'CMatrix& operator += (CMatrix& cMatrixB);  // 'CMatrix .* CMatrix'CMatrix operator / (CMatrix& cMatrixB);    /// Transpose the matrix//CMatrix Transpose();/// Inverse the matrix//CMatrix Inverse();/// Load the data from the file and reset the rows and the colums of the // matrix//bool LoadDataFromFile(CString& strFileName);bool LoadDataFromBase(char* TableName,int Row,int Col); //load form database sqlserver 2000 add by hzh 2015.2.5/// Save the data from the CMatrix object to the specified file//bool SaveDataToFile(CString& strFileName);/// Get the matrix Row Number//unsigned int GetMatrixRowNumber() const{return m_nRow;}/// Get the matrix Colum Number//unsigned int GetMatrixColNumber() const{return m_nCol;}/// Load the data from the file and reset the rows and the colums of // the matrixes.// Parameter://        [in] strFileName//      [out]cMatrixInputToHideWeightValue//        [out]cMatrixHideLayerValveValue//       [out]cMatrixHideToOutputWeightValue//       [out]cMatrixOutputLayerValveValue//     [out]nInputLayerNumber//        [out]nHideLayerNumber//     [out]nOutputLayerNumber//       [out]nComboArithmetic//     [out]nComboFunc//bool LoadDataFromFileSpecial ( CString& strFileName,CMatrix& cMatrixInputToHideWeightValue,CMatrix& cMatrixHideLayerValveValue,CMatrix& cMatrixHideToOutputWeightValue,CMatrix& cMatrixOutputLayerValveValue,unsigned int &nInputLayerNumber,unsigned int &nHideLayerNumber,unsigned int &nOutputLayerNumber,int &nComboArithmetic,int &nComboFunc);///    Copy data from a vector to a matrix//   Parameter://        [out]   cMatrix ----> the returned value//       [in]    nIndex  ----> the index in vector//  Notes://        the object copied must be vector!!!//void CopySubMatrixFromVector(CMatrix& cMatrix,unsigned int nIndex);/// Copy data from sub matrix to another matrix// Parameter://      [out]   cMatrix ----> 矩阵的子矩阵返回的结果//      [in]    nStartX ----> 子矩阵在矩阵中的起始坐标,对应行,索引从1开始//      [in]    nStartY ----> 子矩阵在矩阵中的起始坐标,对应列,索引从1开始//void CopySubMatrix(CMatrix& cMatrix,unsigned int nStartX,unsigned int nStartY);/// Copy Matrix//  Parameter://        [in]    cMatrix ----> be copied matrix//void CopyMatrix(CMatrix& cMatrix);/// 将矩阵的所有的元素按列合成一列//  例如://        matrix = [//           1   2   3//         4   5   6//         7   8   9//             ]//     CMatrix cMatrix = matrix.MergeColumnsToColumnVector();//       cMatrix = //           [   1//             4   //              7//             2//             5//             8//             3//             6//             9   ]//CMatrix MergeColumnsToColumnVector();/// 对矩阵中所有的元素进行一次非线性变换://       变换后的值y与变换前的值的关系是://         y = f(x) = 1 / (1 + exp(-x)) ( 0 < f(x) < 1)//CMatrix Sigmoid();/// 对矩阵中所有的元素进行一次非线性变换://      变换后的值y与变换前的值的关系是://         y = f'(x) = (1 / (1 + exp(-x)))'   ( 0 < f(x) < 1)//           = exp(-x)/((1 + exp(-x))*(1 + exp(-x)))//CMatrix SigmoidDerivative();/// 对矩阵中所有的元素进行一次非线性变换://     变换后的值y与变换前的值的关系是://         y = tanh(x) = (1 - exp(-x)) / (1 + exp(-x))//                     =  1 - 2 * exp(-x) / (1 + exp(-x))   ( -1 < f(x) < 1)//CMatrix tanh(); /// 对矩阵中所有的元素进行一次非线性变换://       变换后的值y与变换前的值的关系是://         y = tanh'(x) = ((1 - exp(-x)) / (1 + exp(-x)))'    ( -1 < f(x) < 1)//                     =     2*exp(-x)/((1 + exp(-x))*(1 + exp(-x)))//CMatrix tanhDerivative();/// 对矩阵中所有的元素进行一次非线性变换://       变换后的值y与变换前的值的关系是://         y = Tansig(x) = 2 / (1 + exp(-2 * x)) -1//CMatrix Tansig();/// 对矩阵中所有的元素进行一次非线性变换://     变换后的值y与变换前的值的关系是://         y = Tansig'(x) = (2 / (1 + exp(-2 * x)) -1)'//             = (2 / (1 + exp(-2 * x)) -1) * (2 / (1 + exp(-2 * x)) -1) -1//CMatrix TansigDerivative();/// 对矩阵中的元素进行一次操作://        使所有行中的相对应的列元素相等//   Parameter://        nRowIndex   ---->    行索引值(the index starts from 0)//                         以此行做为标准,使矩阵中其余的行相对应的列的值//                           与此行相对应的列的值相等    //void MakeAllColumnElementsSameValue(unsigned int nRowIndex);/// 对矩阵中的元素进行一次操作://      使矩阵变为单位阵//void Eye();/// Get System Error//double   GetSystemError() const;/// Make all the matrix elements to be changed into absolute value//CMatrix AbsoluteValue();/// Parameter://     CMatrix& cMatrix:       被拷贝的数据源//       unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置// Purpose://      This function will copy all the data of the cMatrix// Notes://      The object must be column vector!!!//void GetMatrixData(CMatrix& cMatrix, unsigned int nIndex);/// Parameter://     CMatrix& cMatrix:       被填充的矩阵//        unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置// Purpose://      This function will copy part of the object data into cMatrix// Notes://     The object must be column vector!!!//void SetMatrixData(CMatrix& cMatrix, unsigned int nIndex);/// Parameter://     CMatrix& cMatrix:       被拷贝的数据源//       unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置//     unsigned int nRow:      被拷贝的数据在被拷贝对象中的行索引(从0开始)// Purpose://        This function will copy all the data of the cMatrix// Notes://      The object must be column vector!!!//void GetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow);/// Parameter://       CMatrix& cMatrix:       被填充的矩阵//        unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置//     unsigned int nRow:      被填充的数据在被填充对象中的行索引// Purpose://      This function will copy part of the object data to fill the special // row of the cMatrix// Notes://        The object must be column vector!!!//void SetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow);/// Get the total value of the matrixdouble GetTotalElementValue();/// 对矩阵进行拓展//   实现功能://     对矩阵的列数进行拓展,nTimes是每列拓展的次数//void nncpyi(CMatrix &cMatrix, unsigned int nTimes);/// 对矩阵进行拓展// 实现功能://     对矩阵的列数进行拓展//    matrix =   [ //            1   2   3//         4   5   6//         7   8   9//             ]////       nncpyd(matrix)  =  [//         1   0   0   2   0   0   3   0   0//         0   4   0   0   5   0   0   6   0//         0   0   7   0   0   8   0   0   9//                         ]void nncpyd(CMatrix &cMatrix);/// 对矩阵进行拓展//    实现功能://     对矩阵的列数进行拓展,nTimes是每列拓展的次数// matrix =   [ //            1   2   3//         4   5   6//         7   8   9//             ]//     nTimes = 2////     nncpyd(matrix)  =  [//                 1   2   3   1   2   3//                 4   5   6   4   5   6//                 7   8   9   7   8   9//                         ]//void nncpy (CMatrix& cMatrix, unsigned int nTimes);private:unsigned int m_nRow;          // 矩阵所拥有的行数unsigned int m_nCol;         // 矩阵所拥有的列数/// 注意://        在重新设置矩阵的行数和列数后,矩阵中的元素被重新初始化为0//// 设置矩阵的行数//void SetMatrixRowNumber(unsigned int nRow);/// 设置矩阵的列数//void SetMatrixColNumber(unsigned int nCol);/// 设置矩阵的行列数//void SetMatrixRowAndCol(unsigned int nRow,unsigned int nCol);/// 交换矩阵的两行//void SwapMatrixRow(unsigned int nRow1,unsigned int nRow2);/// 交换矩阵的两列//void SwapMatrixCol(unsigned int nCol1,unsigned int nCol2);};/
// overload operator 'double - CMatrix'
__declspec(dllexport) CMatrix operator - (double nValue,CMatrix& cMatrixB);/
// 矩阵合并运算符
//  合并规则:
//      1. 参与合并运算的两个矩阵的行数必须相等;
//      2. 参与合并的两个矩阵的列数可以不相等;
//      3. 合并后返回的矩阵的行数与参与合并的矩阵的行数相等,列数是参与合并的
//          两个矩阵的列数之和;
//
__declspec(dllexport) CMatrix MergeMatrix(CMatrix& cMatrixA,CMatrix& cMatrixB);#endif // _MATRIX_H

/
// Matrix.cpp : Implementation of the class Matrix
//
/#include "stdafx.h"
#include "Matrix.h"
#include <math.h>
#include <stdlib.h>
#include "NNBP.h" //实例头文件,根据需要修改
#include <conio.h>
#include <stdio.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//
// Construction/Destruction
//CMatrix::CMatrix()
{m_nRow = 0;m_nCol = 0;m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}
}CMatrix::~CMatrix()
{   }CMatrix::CMatrix(unsigned int nRow,unsigned int nCol)
{// 动态分配二维数组TMatrix tMatrix;tMatrix.resize (nRow);for(unsigned int i=0; i < nRow; i++){for(unsigned int j=0; j < nCol; j++){tMatrix[i].resize(nCol);tMatrix[i][j] = (double) 0;}}// 对对象变量赋值m_nRow  = nRow;m_nCol  = nCol;m_pTMatrix = tMatrix;}CMatrix::CMatrix(CMatrix& cMatrixB)
{// Initialize the variablem_nRow = cMatrixB.m_nRow ;m_nCol = cMatrixB.m_nCol ;m_pTMatrix = cMatrixB.m_pTMatrix ;// Copy Datafor(unsigned int i=0; i< cMatrixB.m_nRow; i++){for(unsigned int j=0; j < cMatrixB.m_nCol; j++){m_pTMatrix [i][j] = cMatrixB.m_pTMatrix [i][j];}}}/
// CMatrix member functions
//CMatrix CMatrix::operator +(CMatrix& cMatrixB)
{// 要满足矩阵相加的条件: 行列数目相等!if(m_nRow != cMatrixB.m_nRow || m_nCol != cMatrixB.m_nCol ){::AfxMessageBox (TEXT("执行相加的两个矩阵维数不相等!"),MB_OK | MB_ICONERROR);}CMatrix  cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [i][j] + cMatrixB.m_pTMatrix [i][j];}}return    cMatrix;}CMatrix CMatrix::operator -(CMatrix& cMatrixB)
{// 要满足矩阵相加的条件: 行列数数目相等!if(m_nRow != cMatrixB.m_nRow || m_nCol != cMatrixB.m_nCol ){::AfxMessageBox (TEXT("执行相减的两个矩阵维数不相等!"),MB_OK | MB_ICONERROR);}CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [i][j] - cMatrixB.m_pTMatrix [i][j];}}return cMatrix;}CMatrix CMatrix::operator *(CMatrix& cMatrixB)
{if( m_nCol != cMatrixB.m_nRow ){::AfxMessageBox (TEXT("执行相乘的两个矩阵维数不满足相乘的条件!"),MB_OK | MB_ICONERROR);}CMatrix cResultMatrix(m_nRow,cMatrixB.m_nCol);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < cMatrixB.m_nCol; j++){for(unsigned int m=0; m < m_nCol; m++){cResultMatrix.m_pTMatrix [i][j] +=  m_pTMatrix [i][m] * cMatrixB.m_pTMatrix [m][j];}}}return cResultMatrix;
}CMatrix CMatrix::operator * (double nValue)
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] =m_pTMatrix [i][j] * nValue;}}return cMatrix;
}CMatrix& CMatrix::operator =(CMatrix& cMatrixB)
{if( (m_nRow != cMatrixB.m_nRow) || (m_nCol != cMatrixB.m_nCol) ){::AfxMessageBox(TEXT("等号左右两边的矩阵的维数不相等!"),MB_OK | MB_ICONERROR);return *this;  // return invalid value}    // 给变量赋值m_nRow = cMatrixB.m_nRow ;m_nCol = cMatrixB.m_nCol ;m_pTMatrix = cMatrixB.m_pTMatrix ;// 赋值操作for(unsigned int i=0; i < cMatrixB.m_nRow; i++){for(unsigned int j=0; j< cMatrixB.m_nCol; j++){m_pTMatrix [i][j] = cMatrixB.m_pTMatrix [i][j];}}return *this;
}CMatrix& CMatrix::operator += (CMatrix& cMatrixB)
{if(m_nRow != cMatrixB.m_nRow || m_nCol != cMatrixB.m_nCol ){//printf("错误!执行相加的两个矩阵维数不相等!\n");::AfxMessageBox (TEXT("运算符的两边矩阵的维数不相等!"),MB_OK | MB_ICONERROR);return *this;    // return invalid value}// 赋值操作for(unsigned int i=0; i < cMatrixB.m_nRow; i++){for(unsigned int j=0; j< cMatrixB.m_nCol; j++){m_pTMatrix [i][j] += cMatrixB.m_pTMatrix [i][j];}}return *this;}CMatrix CMatrix::Transpose()
{CMatrix cMatrix(m_nCol,m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [j][i] = m_pTMatrix [i][j];}}return cMatrix;
}/
// 将矩阵的所有的元素按列合成一列
//  例如:
//      matrix = [
//          1   2   3
//          4   5   6
//          7   8   9
//              ]
//      CMatrix cMatrix = matrix.MergeColumnsToColumnVector();
//      cMatrix =
//          [   1
//              4
//              7
//              2
//              5
//              8
//              3
//              6
//              9   ]
/CMatrix CMatrix::MergeColumnsToColumnVector()
{CMatrix cMatrix(m_nRow * m_nCol,(unsigned int)1);// 对矩阵赋值for(unsigned int j=0; j < m_nCol; j++){for(unsigned int i=0; i < m_nRow; i++){cMatrix.m_pTMatrix [i + j * m_nRow][(unsigned int)0] = m_pTMatrix [i][j];}}return cMatrix;}/
// Get the total value of the matrix
/double CMatrix::GetTotalElementValue()
{double nTotalValue = 0;for(unsigned int i=0; i < m_nRow; i++){for( unsigned int j=0; j < m_nCol; j++){nTotalValue += m_pTMatrix [i][j];}}return nTotalValue;
}/
// Get System Error
/double CMatrix::GetSystemError() const
{double nSystemError = 0;for(unsigned int i=0; i < m_nRow; i++){for( unsigned int j=0; j < m_nCol; j++){nSystemError += m_pTMatrix [i][j] * m_pTMatrix [i][j];}}return nSystemError;}/
// Make all the matrix elements to be changed into absolute value
/CMatrix CMatrix::AbsoluteValue ()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = fabs( m_pTMatrix [i][j]);}}return cMatrix;}CMatrix CMatrix::Inverse()
{/// Using Gauss - Jordan Method// 参考书目: 计算机数值方法 --->施吉林 陈桂枝//// 判断是否是可逆阵://     可逆阵一定是方阵!!!if ( m_nRow != m_nCol){//printf("错误!矩阵的行列数不相等,是非可逆阵!\n");::AfxMessageBox (TEXT("矩阵的行列数不相等,是非可逆阵!"),MB_OK | MB_ICONERROR);}CMatrix cMatrix = *this;//***********************************************************************// 思路:(非常规思维!)//        动态分配整型数组(2*m_nCol)来存储每次交换的行坐标的值//       不论有没有行交换都记录在数组中,//      1.没进行行交换的两个数据相等,在SwapMatrixRow()函数中//       检测到两个值相等立即返回,在SwapMatrixCol()函数中也一样,//      检测到两个值相等立即返回,不占用系统资源;//     2.不相等的就交换//***********************************************************************//    分配内存int *pIntArray = new int [2*m_nCol];// nSetp --- 约化步数,按列展开 for(unsigned int k=0; k < cMatrix.m_nCol; k++){/// 进行行交换 ---> 游戏规则:// 为保证计算过程的数值稳定性,在第k步约化时,先在{a(ik)}|i=k->n中选按// 模最大者作为约化主元素,并交换矩阵相应的行// 标记主元素double nMaxElement = cMatrix.m_pTMatrix [k][k];// 标记主元素所在的行数unsigned int nMainRow = k;for(unsigned int nCount = k+1; nCount < cMatrix.m_nCol; nCount++){if( fabs(nMaxElement) < fabs(cMatrix.m_pTMatrix [nCount][k]) ){nMaxElement = cMatrix.m_pTMatrix [nCount][k];nMainRow = nCount;}}// 将欲交换的行数存在数组中pIntArray [2*k] = k;pIntArray [2*k+1] = nMainRow;// 交换行cMatrix.SwapMatrixRow(k,nMainRow);//Display();// 判断是否是可逆阵if(cMatrix.m_pTMatrix [k][k] == 0){//printf("错误!此矩阵为非可逆阵!\n");::AfxMessageBox (TEXT("此矩阵为非可逆阵,没有逆矩阵!"),MB_OK | MB_ICONERROR);}cMatrix.m_pTMatrix [k][k] = 1/(cMatrix.m_pTMatrix [k][k]);// 算主列for(unsigned int i=0; i < cMatrix.m_nRow; i++){  if( i != k)cMatrix.m_pTMatrix [i][k] = -(cMatrix.m_pTMatrix [k][k]) * (cMatrix.m_pTMatrix [i][k]); //int nTempValue = m_pTMatrix [i][k];}//printf("\n");// 约化非主行for(unsigned int m=0; m < cMatrix.m_nRow; m++){if ( m == k)continue;for(unsigned int n=0; n < cMatrix.m_nCol; n++){if ( n == k)continue;cMatrix.m_pTMatrix [m][n] += cMatrix.m_pTMatrix [m][k] * cMatrix.m_pTMatrix [k][n];//printf("%10f ",m_pTMatrix [m][n]);}//printf("\n");}// 算主行for(unsigned int j=0; j < cMatrix.m_nCol; j++){if( j != k)cMatrix.m_pTMatrix [k][j] = (cMatrix.m_pTMatrix [k][k]) * (cMatrix.m_pTMatrix [k][j]);}}/// 进行列交换 ---> 对交换行后的矩阵进行列交换 ---> 还原矩阵// 游戏规则:// 将开始矩阵中进行的行交换 ---> 现用相对应的列交换进行还原,即可得到所求的// 逆矩阵for(int i=2*m_nCol-1; i > 0; i--){cMatrix.SwapMatrixCol(pIntArray[i],pIntArray[i-1]);i--;}delete []pIntArray;return cMatrix;}void CMatrix::SwapMatrixRow(unsigned int nRow1,unsigned int nRow2)
{if( nRow1 == nRow2)return;double *pArray = new double;for(unsigned int i=0; i < m_nCol; i++){// Swap the datum of the two rowspArray[0] = m_pTMatrix [nRow1][i];m_pTMatrix [nRow1][i] = m_pTMatrix [nRow2][i];m_pTMatrix [nRow2][i] = pArray[0];}delete pArray;
}void CMatrix::SwapMatrixCol(unsigned int nCol1,unsigned int nCol2)
{if( nCol1 == nCol2)return;double *pArray = new double;for(unsigned int i=0; i < m_nRow; i++){// Swap the datum of the two columnspArray[0] = m_pTMatrix [i][nCol1];m_pTMatrix [i][nCol1] = m_pTMatrix [i][nCol2];m_pTMatrix [i][nCol2] = pArray[0];}delete pArray;
}
bool CMatrix::LoadDataFromBase(char* TableName,int Row,int Col)
{CNNBPApp* pApp = (CNNBPApp*)AfxGetApp(); //实例名,根据需要修改//设置矩阵的行列m_nRow =Row;SetMatrixRowNumber(m_nRow);m_nCol =Col;SetMatrixColNumber(m_nCol);double GetValue;SDWORD cbName;char ss[1024];HSTMT hStmt;RETCODE retcode;sprintf(ss,"select * from %s",TableName);if(SQLAllocStmt(pApp->m_pDataBase->m_hdbc,&hStmt)!=SQL_SUCCESS)  //m_pDataBase为CDataBase*{AfxMessageBox("SQLAllocStmt error !",MB_OK);return FALSE;}retcode = SQLExecDirect(hStmt, (unsigned char *)ss, SQL_NTS); if((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {SQLFreeStmt(hStmt,SQL_DROP);AfxMessageBox("SQLExecDirect Error",MB_OK);return FALSE;}int i=0;while(retcode==SQL_SUCCESS){ retcode = SQLFetch(hStmt); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){for(int j=1;j<=Col;j++){ SQLGetData(hStmt, j, SQL_C_DOUBLE, &GetValue, 256, &cbName);    m_pTMatrix [i][j-1] = GetValue;}}i++;if(i>=Row)break;}SQLFreeStmt(hStmt,SQL_DROP);}bool CMatrix::LoadDataFromFile(CString& strFileName)
{CStdioFile dataFile;LPCTSTR    lpszFileName = "";// CString convert to LPCTSTRstrFileName.TrimLeft ();strFileName.TrimRight ();//strFileName.Format (lpszFileName);lpszFileName = (LPCTSTR)strFileName;if(!dataFile.Open (lpszFileName,CFile::modeRead | CFile::typeText)){::AfxMessageBox (TEXT("不能打开要读取数据的文件!"),MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}// 用来存储提取文本文件中一行的数据CString   strData;                 // 用来记录文本文件中一共有多少行数据?unsigned int  nRow = 0;      /// Step 1: 得到文件的行列数目并根据文本文件的行列数目来设置对象(矩阵)的行// 列数目//while(dataFile.ReadString (strData) != FALSE){++nRow;}// 根据文本文件的数据的行数设置对象(矩阵)的行数m_nRow = nRow;SetMatrixRowNumber(m_nRow);// 重新定位当前文件指针到文件开头dataFile.SeekToBegin ();dataFile.ReadString (strData);strData.TrimLeft ();strData.TrimRight ();TCHAR SPACE_CHARACTER = ' ';// 用来记录文本文件中一行有多少列?unsigned int    nCol = 0;                      // 空格符在字符串中的位置索引int nIndex = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nCol;// 提取字符串的子字符串,即提取一个double型实数数据//CString strDoubleNumber = strData.Left (nIndex);  // 将字符串转换为double型实数//double RealNumber = atof(strDoubleNumber);//int nTempNumber = strData.GetLength ();strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();// Use for debugging//int nTempNum = strData.GetLength ();}while(nIndex != -1);// 根据文本文件的数据的列数设置对象(矩阵)的列数m_nCol = nCol;SetMatrixColNumber(m_nCol);// End of Getting the Rows and Cols of the Text File//// Step 2: 根据文本文件中的数据对矩阵赋值,并检测每行的列数是否和第一行的// 列数相等,不相等提示出错信息//// 重新定位当前文件指针到文件开头dataFile.SeekToBegin ();// 对矩阵中的元素装入文本文件的数据for(unsigned int i=0; i < m_nRow; i++){dataFile.ReadString (strData);strData.TrimLeft ();strData.TrimRight ();// 验证每行的列数是否与第一行的列数相等unsigned int nVerifyColNum = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nVerifyColNum;if(nIndex != -1){// 提取字符串的子字符串,即提取一个double型实数数据CString strDoubleNumber = strData.Left (nIndex);   // 将字符串转换为double型实数double RealNumber = atof(strDoubleNumber);m_pTMatrix [i][nVerifyColNum - 1] = RealNumber;//int nTempNumber = strData.GetLength ();strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();// Using for debugging//double nReadNumber = m_pTMatrix [i][nVerifyColNum - 1];// Using for debugging//int nTempNum = strData.GetLength ();}else{double RealNumber = atof(strData);m_pTMatrix [i][nVerifyColNum - 1] = RealNumber;}}while(nIndex != -1);if(nVerifyColNum != m_nCol){CString strRowNumber;strRowNumber.Format("%d",i + 1);CString strColNumber;strColNumber.Format("%d",m_nCol);CString strVerifyColNumber;strVerifyColNumber.Format("%d",nVerifyColNum);CString strMessage =  CString(TEXT("文本文件第")) + strRowNumber + CString(TEXT("行一共有")) + strVerifyColNumber + CString(TEXT("列,与第一行中的列数")) + strColNumber + CString(TEXT("不相等!"));LPCTSTR lpszText = "";lpszText = (LPCTSTR)strMessage;//strMessage.FormatMessage (lpszText);//::AfxMessageBox (lpszText,MB_OK);::AfxMessageBox (lpszText,MB_OK | MB_ICONERROR);dataFile.Close ();return false;}}dataFile.Close ();return TRUE;
}/
// Load the data from the file and reset the rows and the colums of
// the matrixes.
// Parameter:
//      [in] strFileName
//      [out]cMatrixInputToHideWeightValue
//      [out]cMatrixHideLayerValveValue
//      [out]cMatrixHideToOutputWeightValue
//      [out]cMatrixOutputLayerValveValue
//      [out]nInputLayerNumber
//      [out]nHideLayerNumber
//      [out]nOutputLayerNumber
//      [out]nComboArithmetic
//      [out]nComboFunc
/bool CMatrix::LoadDataFromFileSpecial (CString& strFileName,CMatrix& cMatrixInputToHideWeightValue,CMatrix& cMatrixHideLayerValveValue,CMatrix& cMatrixHideToOutputWeightValue,CMatrix& cMatrixOutputLayerValveValue,unsigned int &nInputLayerNumber,unsigned int &nHideLayerNumber,unsigned int &nOutputLayerNumber,int &nComboArithmetic,int &nComboFunc)
{CStdioFile dataFile;LPCTSTR    lpszFileName = "";// CString convert to LPCTSTRstrFileName.TrimLeft ();strFileName.TrimRight ();lpszFileName = (LPCTSTR)strFileName;if(!dataFile.Open (lpszFileName,CFile::modeRead | CFile::typeText)){::AfxMessageBox (TEXT("不能打开要读取的数据文件!!!"),MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}// 提取网络参数dataFile.SeekToBegin ();// 用来存储提取文本文件中一行的数据CString    strData;    // 注释标志符号TCHAR cFirstCharacter = '#';// 空格符号TCHAR SPACE_CHARACTER = ' ';// 空格符在字符串中的位置索引int nIndex = 0;// 读取文件中的网络的输入层数目while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{LPCSTR strInputLayerNumber = (LPCSTR)strData;nInputLayerNumber = (unsigned int)atoi(strInputLayerNumber);break;}}// 读取文件中的网络的隐含层数目while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{LPCSTR strHideLayerNumber = (LPCSTR)strData;nHideLayerNumber = (unsigned int)atoi(strHideLayerNumber);break;}}// 读取文件中的网络的输出层数目while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{LPCSTR strOutputLayerNumber = (LPCSTR)strData;nOutputLayerNumber = (unsigned int)atoi(strOutputLayerNumber);break;}}// 读取文件中的训练网络所使用的算法的索引值while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{LPCSTR strComboArithmetic = (LPCSTR)strData;nComboArithmetic = atoi(strComboArithmetic);break;}}// 读取文件中的网络的使用的函数的索引值while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{LPCSTR strComboFunc = (LPCSTR)strData;nComboFunc = atoi(strComboFunc);break;}}// 根据网络参数设置输入层到隐含层的权值矩阵的行列数cMatrixInputToHideWeightValue.SetMatrixRowAndCol (nHideLayerNumber,nInputLayerNumber);// 验证矩阵的行数unsigned int nVerifyRowNum = 0;// 读取文件中的输入层到隐含层的权值矩阵到相应的矩阵对象中while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{// 装入文本文件的数据到相对应的矩阵中strData.TrimLeft ();strData.TrimRight ();// 验证每行的列数是否与第一行的列数相等unsigned int nVerifyColNum = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nVerifyColNum;if(nIndex != -1){// 提取字符串的子字符串,即提取一个double型实数数据CString strDoubleNumber = strData.Left (nIndex);    // 将字符串转换为double型实数double RealNumber = atof(strDoubleNumber);cMatrixInputToHideWeightValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();}else{double RealNumber = atof(strData);cMatrixInputToHideWeightValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;}}while(nIndex != -1);if(nVerifyColNum != cMatrixInputToHideWeightValue.m_nCol){CString strRowNumber;strRowNumber.Format("%d",nVerifyRowNum + 1);CString strColNumber;strColNumber.Format("%d",m_nCol);CString strVerifyColNumber;strVerifyColNumber.Format("%d",nVerifyColNum);CString strMessage =  CString(TEXT("文本文件第")) + strRowNumber + CString(TEXT("行一共有")) + strVerifyColNumber + CString(TEXT("列,与第一行中的列数")) + strColNumber + CString(TEXT("不相等!"));LPCTSTR lpszText = "";lpszText = (LPCTSTR)strMessage;::AfxMessageBox (lpszText,MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}++nVerifyRowNum;if( nVerifyRowNum == cMatrixInputToHideWeightValue.m_nRow ){break;}}}// Using for debugging//CString strInputToHideWeightValue = TEXT("TempInputToHideWeightValue.txt");//cMatrixInputToHideWeightValue.SaveDataToFile (strInputToHideWeightValue);// 根据网络参数设置隐含层的阀值矩阵的行列数cMatrixHideLayerValveValue.SetMatrixRowAndCol (nHideLayerNumber,(unsigned int)1);nIndex = 0;nVerifyRowNum = 0;// 读取文件中的隐含层的阀值矩阵到相应的矩阵对象中while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{// 装入文本文件的数据到相对应的矩阵中strData.TrimLeft ();strData.TrimRight ();// 验证每行的列数是否与第一行的列数相等unsigned int nVerifyColNum = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nVerifyColNum;if(nIndex != -1){// 提取字符串的子字符串,即提取一个double型实数数据CString strDoubleNumber = strData.Left (nIndex);   // 将字符串转换为double型实数double RealNumber = atof(strDoubleNumber);cMatrixHideLayerValveValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();}else{double RealNumber = atof(strData);cMatrixHideLayerValveValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;}}while(nIndex != -1);if(nVerifyColNum != cMatrixHideLayerValveValue.m_nCol){CString strRowNumber;strRowNumber.Format("%d",nVerifyRowNum + 1);CString strColNumber;strColNumber.Format("%d",m_nCol);CString strVerifyColNumber;strVerifyColNumber.Format("%d",nVerifyColNum);CString strMessage =  CString(TEXT("文本文件第")) + strRowNumber + CString(TEXT("行一共有")) + strVerifyColNumber + CString(TEXT("列,与第一行中的列数")) + strColNumber + CString(TEXT("不相等!"));LPCTSTR lpszText = "";lpszText = (LPCTSTR)strMessage;::AfxMessageBox (lpszText,MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}++nVerifyRowNum;if( nVerifyRowNum == cMatrixHideLayerValveValue.m_nRow ){break;}}}// Using for debugging//CString strHideLayerValveValue = TEXT("TempHideLayerValveValue.txt");//cMatrixHideLayerValveValue.SaveDataToFile (strHideLayerValveValue);// 根据网络参数设置隐含层到输出层的权值矩阵的行列数cMatrixHideToOutputWeightValue.SetMatrixRowAndCol (nOutputLayerNumber,nHideLayerNumber);nIndex = 0;nVerifyRowNum = 0;// 读取文件中的隐含层到输出层的权值矩阵到相应的矩阵对象中while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{// 装入文本文件的数据到相对应的矩阵中strData.TrimLeft ();strData.TrimRight ();// 验证每行的列数是否与第一行的列数相等unsigned int nVerifyColNum = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nVerifyColNum;if(nIndex != -1){// 提取字符串的子字符串,即提取一个double型实数数据CString strDoubleNumber = strData.Left (nIndex);    // 将字符串转换为double型实数double RealNumber = atof(strDoubleNumber);cMatrixHideToOutputWeightValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();}else{double RealNumber = atof(strData);cMatrixHideToOutputWeightValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;}}while(nIndex != -1);if(nVerifyColNum != cMatrixHideToOutputWeightValue.m_nCol){CString strRowNumber;strRowNumber.Format("%d",nVerifyRowNum + 1);CString strColNumber;strColNumber.Format("%d",m_nCol);CString strVerifyColNumber;strVerifyColNumber.Format("%d",nVerifyColNum);CString strMessage =  CString(TEXT("文本文件第")) + strRowNumber + CString(TEXT("行一共有")) + strVerifyColNumber + CString(TEXT("列,与第一行中的列数")) + strColNumber + CString(TEXT("不相等!"));LPCTSTR lpszText = "";lpszText = (LPCTSTR)strMessage;::AfxMessageBox (lpszText,MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}++nVerifyRowNum;if( nVerifyRowNum == cMatrixHideToOutputWeightValue.m_nRow ){break;}}}// Using for debugging//CString strHideToOutputWeightValue = TEXT("TempHideToOutputWeightValue.txt");//cMatrixHideToOutputWeightValue.SaveDataToFile (strHideToOutputWeightValue);// 根据网络参数设置输出层的阀值矩阵的行列数cMatrixOutputLayerValveValue.SetMatrixRowAndCol (nOutputLayerNumber,(unsigned int)1);nIndex = 0;nVerifyRowNum = 0;// 读取文件中的输出层的阀值矩阵到相应的矩阵对象中while(dataFile.ReadString (strData)){strData.TrimLeft ();strData.TrimRight ();if((strData.Find (cFirstCharacter)) == 0){continue;}else{// 装入文本文件的数据到相对应的矩阵中strData.TrimLeft ();strData.TrimRight ();// 验证每行的列数是否与第一行的列数相等unsigned int nVerifyColNum = 0;do{nIndex = strData.Find (SPACE_CHARACTER);++nVerifyColNum;if(nIndex != -1){// 提取字符串的子字符串,即提取一个double型实数数据CString strDoubleNumber = strData.Left (nIndex);   // 将字符串转换为double型实数double RealNumber = atof(strDoubleNumber);cMatrixOutputLayerValveValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;strData = strData.Right (strData.GetLength () - nIndex -1);// 去掉多余的空格strData.TrimLeft ();}else{double RealNumber = atof(strData);cMatrixOutputLayerValveValue.m_pTMatrix [nVerifyRowNum][nVerifyColNum - 1] = RealNumber;}}while(nIndex != -1);if(nVerifyColNum != cMatrixOutputLayerValveValue.m_nCol){CString strRowNumber;strRowNumber.Format("%d",nVerifyRowNum + 1);CString strColNumber;strColNumber.Format("%d",m_nCol);CString strVerifyColNumber;strVerifyColNumber.Format("%d",nVerifyColNum);CString strMessage =  CString(TEXT("文本文件第")) + strRowNumber + CString(TEXT("行一共有")) + strVerifyColNumber + CString(TEXT("列,与第一行中的列数")) + strColNumber + CString(TEXT("不相等!"));LPCTSTR lpszText = "";lpszText = (LPCTSTR)strMessage;::AfxMessageBox (lpszText,MB_OK | MB_ICONERROR);dataFile.Close ();return FALSE;}++nVerifyRowNum;if( nVerifyRowNum == cMatrixOutputLayerValveValue.m_nRow ){break;}}}// Using for debugging//CString strOutputLayerValveValue = TEXT("TempOutputLayerValveValue.txt");//cMatrixOutputLayerValveValue.SaveDataToFile (strOutputLayerValveValue);dataFile.Close ();return TRUE;
}bool CMatrix::SaveDataToFile (CString& strFileName)
{CStdioFile dataFile;LPCTSTR    lpszFileName = "";// CString convert to LPCTSTRstrFileName.TrimLeft ();strFileName.TrimRight ();lpszFileName = (LPCTSTR)strFileName;if(!dataFile.Open (lpszFileName,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText)){::AfxMessageBox(TEXT("不能创建文件!"),MB_OK | MB_ICONERROR);dataFile.Close ();return false;}dataFile.SeekToEnd ();// 将对象(矩阵)中的数据写进文件for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){CString strRealNumber;strRealNumber.Format ("%.16f  ", m_pTMatrix [i][j]);// Using for debugging//double nReadNumber = m_pTMatrix [i][j];char *pBuffer = new char[strRealNumber.GetLength()];memcpy(pBuffer,strRealNumber,strRealNumber.GetLength());dataFile.Write (pBuffer,strRealNumber.GetLength ());}if( i != m_nRow - 1){//char ReturnNewline[] = "\r\n";char ReturnNewline[] = "\n";dataFile.Write (ReturnNewline, (sizeof(ReturnNewline) - 1)/sizeof(char));}}dataFile.Close ();return true;
}/
// 对矩阵中的元素进行一次操作:
//      使矩阵变为单位阵
/void CMatrix::Eye()
{// Verify whether the rows is equal to the columns or notif(m_nRow != m_nCol){::AfxMessageBox (TEXT("此矩阵的行列数不相等!不能转变为单位阵!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){if(i == j){m_pTMatrix [i][j] =   1;}else{m_pTMatrix [i][j] =    0;}}}}/
// Parameter:
//      CMatrix& cMatrix:       被拷贝的数据源
//      unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置,从0开始
// Purpose:
//      This function will copy all the data of the cMatrix
// Notes:
//      此对象必须是列向量!!!
/void CMatrix::GetMatrixData(CMatrix& cMatrix, unsigned int nIndex)
{if(m_nCol != 1){::AfxMessageBox (TEXT("拷贝的矩阵不是列向量!"),MB_OK | MB_ICONERROR);return;}if((m_nRow - nIndex) < (cMatrix.m_nRow * cMatrix.m_nCol)){::AfxMessageBox (TEXT("拷贝矩阵的空间容量不足!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0; i < cMatrix.m_nRow; i++){for(unsigned int j=0; j < cMatrix.m_nCol; j++){m_pTMatrix [nIndex + i * cMatrix.m_nCol + j][0] = cMatrix.m_pTMatrix [i][j];}}}/
// Parameter:
//      CMatrix& cMatrix:       被填充的矩阵
//      unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置
// Purpose:
//      This function will copy part of the object data into cMatrix
// Notes:
//      The object must be column vector!!!
/void CMatrix::SetMatrixData(CMatrix& cMatrix, unsigned int nIndex)
{// Verify whether the colunm number is 1if(m_nCol != 1){::AfxMessageBox (TEXT("本矩阵对象不是列向量,不满足条件!"),MB_OK | MB_ICONERROR);return;}// Verify whether the number of the object element is enough to be copyedif((m_nRow - nIndex) < (cMatrix.m_nRow * cMatrix.m_nCol)){::AfxMessageBox (TEXT("对象中的元素数量不足!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0; i < cMatrix.m_nRow; i++){for(unsigned int j=0; j < cMatrix.m_nCol; j++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [nIndex + i * cMatrix.m_nCol + j][0];// Using for debugging//unsigned int nIndexNumber = nIndex + i * cMatrix.m_nRow + j;//double nData = cMatrix.m_pTMatrix [i][j];}}}/
// Parameter:
//      CMatrix& cMatrix:       被填充的矩阵
//      unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置
//      unsigned int nRow:      被填充的数据在被填充对象中的行索引
// Purpose:
//      This function will copy part of the object data to fill the special
// row of the cMatrix
//  Notes:
//      The object must be column vector!!!
/void CMatrix::SetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow)
{// Verify whether the column number is 1if(m_nCol != 1){::AfxMessageBox (TEXT("本矩阵对象不是列向量,不满足条件!"),MB_OK | MB_ICONERROR);return;}// Verify whether the number of the object element is enough to be copyedif((m_nRow - nIndex) < cMatrix.m_nCol ){::AfxMessageBox (TEXT("对象的元素数量不足!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0; i < cMatrix.m_nCol; i++){cMatrix.m_pTMatrix [nRow][i] = m_pTMatrix [nIndex + i][(unsigned int)0];}}/
// Parameter:
//      CMatrix& cMatrix:       被拷贝的数据源
//      unsigned int nIndex:    被拷贝的数据在对象中的开始索引位置
//      unsigned int nRow:      被拷贝的数据在被拷贝对象中的行索引(从0开始)
// Purpose:
//      This function will copy all the data of the cMatrix
//  Notes:
//      此对象必须是列向量!!!
/void CMatrix::GetMatrixRowData(CMatrix& cMatrix, unsigned int nIndex, unsigned int nRow)
{if(m_nCol != 1){::AfxMessageBox (TEXT("拷贝的矩阵不是列向量!"),MB_OK | MB_ICONERROR);return;}if((m_nRow - nIndex) < cMatrix.m_nCol){::AfxMessageBox (TEXT("拷贝矩阵的空间容量不足!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0; i < cMatrix.m_nCol; i++){m_pTMatrix [nIndex + i][(unsigned int)0] = cMatrix.m_pTMatrix [nRow][i];}}void CMatrix::SetMatrixRowNumber(unsigned int nRow)
{m_nRow = nRow;m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}}void CMatrix::SetMatrixColNumber(unsigned int nCol)
{m_nCol = nCol;m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}}/
// 设置矩阵的行列数
void CMatrix::SetMatrixRowAndCol(unsigned int nRow,unsigned int nCol)
{m_nRow = nRow;m_nCol = nCol;// 分配内存m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}}/
// Initialize()
// 矩阵初始化函数,矩阵的行列数目被初始化为零,矩阵中的元素全部初始化为零
/void CMatrix::Initialize()
{m_nRow = 0;m_nCol = 0;m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}}/
// InitializeZero()
// 矩阵初始化函数,矩阵的行列数目被初始化为零,矩阵中的元素全部初始化为零
/void CMatrix::InitializeZero()
{m_nRow = 0;m_nCol = 0;m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}}/
// RandomInitialize()
// 将矩阵中的元素随机初始化函数,元素的值在(-1,1)之间的小数
/void CMatrix::RandomInitialize ()
{for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix [i][j] = (double)(rand() - (0.5*RAND_MAX)) / (0.5*RAND_MAX);}}}/
// 拷贝矩阵的子矩阵元素到另外一个矩阵中
// Parameter:
//      [out]   cMatrix ----> 矩阵的子矩阵返回的结果
//      [in]    nStartX ----> 子矩阵在矩阵中的起始坐标,对应行,索引从1开始
//      [in]    nStartY ----> 子矩阵在矩阵中的起始坐标,对应列,索引从1开始
/void CMatrix::CopySubMatrix(CMatrix& cMatrix,unsigned int nStartX,unsigned int nStartY)
{if((m_nRow  < cMatrix.m_nRow + nStartY ) | (m_nCol  < cMatrix.m_nCol + nStartX)){::AfxMessageBox (TEXT("被拷贝的矩阵维数小于要拷贝的矩阵所需要的维数!"),MB_OK | MB_ICONERROR);return;}for(unsigned int i=0;  i < cMatrix.m_nRow; i++){for(unsigned int j=0; j < cMatrix.m_nCol; j++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [nStartY + i][nStartX + j]; }}}/
// Copy Matrix
//  Parameter:
//      [in]    cMatrix ----> 被拷贝的矩阵
/void CMatrix::CopyMatrix(CMatrix& cMatrix)
{m_nRow = cMatrix.m_nRow ;m_nCol   = cMatrix.m_nCol ;m_pTMatrix   = cMatrix.m_pTMatrix ;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix [i][j] = cMatrix.m_pTMatrix [i][j];}}}/
//  从一个列向量中拷贝数据到一个矩阵中
//  Parameter:
//      [out]   cMatrix ----> 函数的返回结果
//      [in]    nIndex  ----> 在列向量中的索引值
//  Notes:
//      被拷贝的对象必须是列向量!!!
/void CMatrix::CopySubMatrixFromVector(CMatrix& cMatrix,unsigned int nIndex)
{if(m_nCol != 1){::AfxMessageBox (TEXT("被拷贝的矩阵不是列向量!!!"),MB_OK | MB_ICONERROR);return;}for(unsigned int j=0; j < cMatrix.m_nCol; j++){for(unsigned int i=0; i < cMatrix.m_nRow; i++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [nIndex + j * cMatrix.m_nRow + i ][(unsigned int)0];}}}/
// 对矩阵进列拓展
//  实现功能:
//      对矩阵的列数进行拓展,nTimes是每列拓展的次数
/void CMatrix::nncpyi(CMatrix &cMatrix, unsigned int nTimes)
{m_nRow =  cMatrix.m_nRow ;m_nCol  =  cMatrix.m_nCol *    nTimes;// 根据空间分配内存m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}// 赋值for(i=0; i < m_nRow; i++){for(unsigned int j=0; j < cMatrix.m_nCol; j++){for(unsigned int k=0; k < nTimes; k++){m_pTMatrix [i][j * nTimes + k] = cMatrix.m_pTMatrix [i][j];}}}}/
// 对矩阵进行拓展
//  实现功能:
//      对矩阵的列数进行拓展
//  matrix =   [
//          1   2   3
//          4   5   6
//          7   8   9
//              ]
//
//      nncpyd(matrix)  =  [
//          1   0   0   2   0   0   3   0   0
//          0   4   0   0   5   0   0   6   0
//          0   0   7   0   0   8   0   0   9
//                          ]
/void CMatrix::nncpyd(CMatrix &cMatrix)
{m_nRow =  cMatrix.m_nRow ;m_nCol  =  cMatrix.m_nCol * cMatrix.m_nRow ;// 根据空间分配内存m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}// 给矩阵赋值for(i=0; i < m_nRow; i++){for(unsigned int j=0; j < cMatrix.m_nCol; j++){for(unsigned int k=0; k < cMatrix.m_nRow; k++){if(i == (j * cMatrix.m_nRow + k) % cMatrix.m_nRow )m_pTMatrix [i][j * cMatrix.m_nRow + k] = cMatrix.m_pTMatrix [i][j];}}}}/
// 对矩阵进行拓展
//  实现功能:
//      对矩阵的列数进行拓展,nTimes是每列拓展的次数
//  matrix =   [
//          1   2   3
//          4   5   6
//          7   8   9
//              ]
//      nTimes = 2
//
//      nncpyd(matrix)  =  [
//                  1   2   3   1   2   3
//                  4   5   6   4   5   6
//                  7   8   9   7   8   9
//                          ]
/void CMatrix::nncpy(CMatrix& cMatrix,unsigned int nTimes)
{m_nRow = cMatrix.m_nRow ;m_nCol = cMatrix.m_nCol * nTimes;// 根据空间分配内存m_pTMatrix.resize (m_nRow);for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix[i].resize (m_nCol);m_pTMatrix[i][j] = (double) 0;}}// 对矩阵赋值for(i=0; i < m_nRow; i++){for(unsigned int j=0; j < nTimes; j++){for(unsigned int k=0; k < cMatrix.m_nCol; k++){m_pTMatrix [i][j * cMatrix.m_nCol + k] = cMatrix.m_pTMatrix [i][k];}}}}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = f(x) = 1 / (1 + exp(-x)) ( 0 < f(x) < 1)
//
/CMatrix CMatrix::Sigmoid()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = 1 / (1 + exp(-m_pTMatrix [i][j]));}}return cMatrix;
}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = tanh(x) = (1 - exp(-x)) / (1 + exp(-x))
//                   =  1 - 2 * exp(-x) / (1 + exp(-x))   ( -1 < f(x) < 1)
//
/CMatrix CMatrix::tanh ()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = 1 - (2 * exp(-m_pTMatrix [i][j])) / (1 + exp(-m_pTMatrix [i][j]));}}return cMatrix;
}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = Tansig(x) = 2 / (1 + exp(-2 * x)) -1
/CMatrix CMatrix::Tansig()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = 2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1;}}return cMatrix;}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = Tansig'(x) = (2 / (1 + exp(-2 * x)) -1)'
//              = (2 / (1 + exp(-2 * x)) -1) * (2 / (1 + exp(-2 * x)) -1) -1
/CMatrix CMatrix::TansigDerivative()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = (2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1) * (2 / (1 + exp(- 2 * m_pTMatrix [i][j])) - 1) - 1;}}return cMatrix;}/
// 对矩阵中的元素进行一次操作:
//      使所有行中的相对应的列元素相等
//  Parameter:
//      nRowIndex   ---->    行索引值(从零开始)
//                          以此行做为标准,使矩阵中其余的行相对应的列的值
//                          与此行相对应的列的值相等
/void CMatrix::MakeAllColumnElementsSameValue(unsigned int nRowIndex)
{for(unsigned int i=0; i < m_nRow; i++){if(i == nRowIndex)continue;for(unsigned int j=0; j < m_nCol; j++){m_pTMatrix [i][j] = m_pTMatrix [nRowIndex][j];}}}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = f'(x) = (1 / (1 + exp(-x)))'   ( 0 < f(x) < 1)
//            = exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
/CMatrix CMatrix::SigmoidDerivative()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = exp(-m_pTMatrix [i][j]) / ((1 + exp(-m_pTMatrix [i][j])) * (1 + exp(-m_pTMatrix [i][j])));}}return cMatrix;
}/
// 对矩阵中所有的元素进行一次非线性变换:
//      变换后的值y与变换前的值的关系是:
//          y = tanh'(x) = ((1 - exp(-x)) / (1 + exp(-x)))'    ( -1 < f(x) < 1)
//                   =     2*exp(-x)/((1 + exp(-x))*(1 + exp(-x)))
/CMatrix CMatrix::tanhDerivative()
{CMatrix cMatrix = *this;for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = 2 * exp(-m_pTMatrix [i][j]) / ((1 + exp(-m_pTMatrix [i][j])) * (1 + exp(-m_pTMatrix [i][j])));}}return cMatrix;
}/
// 实现对点乘操作符的重载
/CMatrix CMatrix::operator / (CMatrix& cMatrixB)
{CMatrix cMatrix = *this;if( (m_nRow != cMatrixB.m_nRow) || (m_nCol != cMatrixB.m_nCol) ){::AfxMessageBox (TEXT("两个矩阵的维数不相等,不满足矩阵点乘的条件!"),MB_OK | MB_ICONERROR);return cMatrix;    // return a invalid value}for(unsigned int i=0; i < m_nRow; i++){for(unsigned int j=0; j < m_nCol; j++){cMatrix.m_pTMatrix [i][j] = m_pTMatrix [i][j] * cMatrixB.m_pTMatrix [i][j];}}return cMatrix;}//***************************************************************************
// ordinary function
///
// 重载 'double - CMatrix' 运算符
/CMatrix operator - (double nValue,CMatrix& cMatrixB)
{CMatrix    cMatrix = cMatrixB;for(unsigned int i=0; i < cMatrix.GetMatrixRowNumber (); i++){for(unsigned int j=0; j < cMatrix.GetMatrixColNumber (); j++){cMatrix.m_pTMatrix [i][j] = nValue - cMatrixB.m_pTMatrix [i][j];}}return cMatrix;
}/
// 矩阵合并运算符
//  合并规则:
//      1. 参与合并运算的两个矩阵的行数必须相等;
//      2. 参与合并的两个矩阵的列数可以不相等;
//      3. 合并后返回的矩阵的行数与参与合并的矩阵的行数相等,列数是参与合并的
//          两个矩阵的列数之和;
/CMatrix MergeMatrix(CMatrix& cMatrixA,CMatrix& cMatrixB)
{// 条件检测if( cMatrixA.GetMatrixRowNumber () != cMatrixB.GetMatrixRowNumber () ){::AfxMessageBox (TEXT("参与合并的两个矩阵的行数不相等!"),MB_OK | MB_ICONERROR);return cMatrixA;  // return invalid value}CMatrix cMatrix(cMatrixA.GetMatrixRowNumber (),cMatrixA.GetMatrixColNumber () + cMatrixB.GetMatrixColNumber ());for(unsigned int i=0; i < cMatrixA.GetMatrixRowNumber (); i++){for(unsigned int j=0; j < cMatrixA.GetMatrixColNumber (); j++){cMatrix.m_pTMatrix [i][j] = cMatrixA.m_pTMatrix [i][j];}for(unsigned int k=0; k < cMatrixB.GetMatrixColNumber (); k++){cMatrix.m_pTMatrix [i][cMatrixA.GetMatrixColNumber () + k] = cMatrixB.m_pTMatrix [i][k];}}return cMatrix;
}// End of ordinary function
//***************************************************************************

一个矩阵类,很好用,分享给大家相关推荐

  1. 利用二维数组实现一个矩阵类:Matrix

    利用二维数组实现一个矩阵类:Matrix.要求提供以下操作: (1)set(int row, int col, double value):将第row行第col列的元素赋值为value: (2)get ...

  2. 利用二维数组(double[])实现一个矩阵类:Matrix。要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为valu

    利用二维数组(double[])实现一个矩阵类:Matrix.要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为valu ...

  3. 实现一个矩阵类 Matrix

    @矩阵类,MatrixTOC 欢迎使用Markdown编辑器 import java.util.Scanner; import java.util.HashMap; import java.util. ...

  4. 和我一起写矩阵类(一)

    和我一起写矩阵类(一) 大连理工大学软件学院WAKU(转载请保留署名) 最近Mr.Zeng的一个作业就是自己实现一个矩阵类,这是一个非常有实用价值的类.我花了几天完成了,期间也增长了很多知识,不敢独享 ...

  5. C++实战笔记(一):矩阵类

    前言   上大学之前就对C++有过一些了解,知道C++是一种功能十分强大的语言.大一时学习了C语言,了解了面向过程的编程方法.现在大三开始学习C++,初步接触了面向对象的编程思想,对C++功能更为着迷 ...

  6. 基于Springboot+Vue的MOBA类游戏攻略分享平台

    摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,M ...

  7. C++ | 矩阵类模板(类模板)

    问题 B: 矩阵类模板(类模板) 时间限制: 1 Sec  内存限制: 128 MB 提交: 559  解决: 314 [提交][状态][讨论版] 题目描述 设计一个矩阵类模板Matrix,支持任意数 ...

  8. 源码分享:C++矩阵类CLMatrixT,功能强大使用简单,支持内存池、宽指令、并行化加速!持续更新...

    CLMatrixT文档目录: C++矩阵类模板CLMatrixT介绍: 特点 新增功能 先演示使用方法: 再看运行测试结果: 最后分享源代码: C++矩阵类模板CLMatrixT介绍: 最近在研究AI ...

  9. python定义一个1xn矩阵_Python实现的矩阵类实例

    本文实例讲述了Python实现的矩阵类.分享给大家供大家参考,具体如下: 科学计算离不开矩阵的运算.当然,python已经有非常好的现成的库: 我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练 ...

最新文章

  1. react 组件连动效果_react-redux应用之独立组件联动实例
  2. day16-筛选器以及Tab菜单示例
  3. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...
  4. PAT A1030 动态规划
  5. python 发邮件 timeout_python发送邮件
  6. 领域驱动设计之领域模型_在领域驱动的设计,贫乏的领域模型,代码生成,依赖项注入等方面……...
  7. Loguru:Python 日志终极解决方案
  8. oracle立即关闭数据库,Oracle数据库的起步和关闭
  9. java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!
  10. 通用线程 -- sed 实例
  11. DVB 数字电视基础知识
  12. CSS文字加粗,字体,颜色渐变,消失总结
  13. 期刊评价查询+机器人领域期刊排名
  14. 跨域单点登录解决方案
  15. 什么是数据增强(Data Augmentation)
  16. Linux分卷压缩zip文件命令,linux下的几种分卷压缩命令
  17. 【Java容器】Java容器入门教程
  18. STM32 CubeMX学习:7. ADC模数转化
  19. #define ok 1 是什么意思 数据结构书上的
  20. 标准oc算法的推导与99行代码详解

热门文章

  1. 解决Ubuntu 20.04挂载NTFS分区不能写入(只读权限)的问题
  2. 安装完搜狗输入法发现输出的是繁体字。
  3. Java处理多个List集合中对象数据合并处理数据后为同一个List集合对象
  4. Propensity Score Matching
  5. 要取好名字的来这儿!哈哈
  6. Typora常用快捷键(仅记录常用功能)
  7. if……else if……else注意事项与基本用法
  8. 神策2020数据驱动用户大会:新愿景 + 新定位 + 新舰队正式亮相!
  9. zone2021 E-Sneaking
  10. 5行代码提升时间序列预测,都有用!