📄 matrix.cpp
字号:
bool CMatrix::LoadDataFromFile(CString& strFileName)
{
CStdioFile dataFile;
LPCTSTR lpszFileName = "";
// CString convert to LPCTSTR
strFileName.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 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;
}
}
// 读取文件中的训练网络所使用的算法的索引值
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 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -