?? 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 + -