📄 matrix.cpp
字号:
{
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;
}
bool CMatrix::SaveDataToFile(CString &strFileName)
{
CStdioFile dataFile;
LPCTSTR lpszFileName = "";
// CString convert to LPCTSTR
strFileName.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;
}
bool CMatrix::LoadNetworkData(CString& strFileName,
CMatrix& cMatrixInputToHideWeightValue,
CMatrix& cMatrixHideLayerValveValue,
CMatrix& cMatrixHideToOutputWeightValue,
CMatrix& cMatrixOutputLayerValveValue,
unsigned int &nInputLayerNumber,
unsigned int &nHideLayerNumber,
unsigned int &nOutputLayerNumber)
{
CStdioFile dataFile;
LPCTSTR lpszFileName = "";
// CString convert to LPCTSTR
strFileName.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;
}
}
// 根据网络参数设置输入层到隐含层的权值矩阵的行列数
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;
}
}
}
// 根据网络参数设置隐含层的阈值矩阵的行列数
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;
}
}
}
// 根据网络参数设置隐含层到输出层的权值矩阵的行列数
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;
}
}
}
// 根据网络参数设置输出层的阈值矩阵的行列数
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;
}
}
}
dataFile.Close ();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -