⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cpp

📁 专家系统-神经网络代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

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