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

📄 matrix.cpp

📁 一个bp的VC源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	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 + -