📄 subject_59729.htm
字号:
<br>内容:我也写了一个矩阵的类,但是我实现的功能里没这个~我实现的功能有一个求矩阵逆的我认为还不错~希望能看看LLB大侠的代码,提高自己~期待中~
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:李彬彬 回复日期:2003-12-11 09:03:49
<br>内容:我分开传吧!代码太长,请别见笑!俺不是什么大侠,俺是妹子,请多多指教!Matric.cpp代码:<BR>CMatrix::CMatrix()<BR>{<BR> m_nNumColumns = 1;<BR> m_nNumRows = 1;<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);<BR> ASSERT(bSuccess);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 指定行列构造函数<BR>//<BR>// 参数:<BR>// 1. int nRows - 指定的矩阵行数<BR>// 2. int nCols - 指定的矩阵列数<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::CMatrix(int nRows, int nCols)<BR>{<BR> m_nNumRows = nRows;<BR> m_nNumColumns = nCols;<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);<BR> ASSERT(bSuccess);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 指定值构造函数<BR>//<BR>// 参数:<BR>// 1. int nRows - 指定的矩阵行数<BR>// 2. int nCols - 指定的矩阵列数<BR>// 3. double value[] - 一维数组,长度为nRows*nCols,存储矩阵各元素的值<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::CMatrix(int nRows, int nCols, double value[])<BR>{<BR> m_nNumRows = nRows;<BR> m_nNumColumns = nCols;<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);<BR> ASSERT(bSuccess);<BR><BR> SetData(value);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 方阵构造函数<BR>//<BR>// 参数:<BR>// 1. int nSize - 方阵行列数<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::CMatrix(int nSize)<BR>{<BR> m_nNumRows = nSize;<BR> m_nNumColumns = nSize;<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(nSize, nSize);<BR> ASSERT (bSuccess);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 方阵构造函数<BR>//<BR>// 参数:<BR>// 1. int nSize - 方阵行列数<BR>// 2. double value[] - 一维数组,长度为nRows*nRows,存储方阵各元素的值<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::CMatrix(int nSize, double value[])<BR>{<BR> m_nNumRows = nSize;<BR> m_nNumColumns = nSize;<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(nSize, nSize);<BR> ASSERT (bSuccess);<BR><BR> SetData(value);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 拷贝构造函数<BR>//<BR>// 参数:<BR>// 1. const CMatrix& other - 源矩阵<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::CMatrix(const CMatrix& other)<BR>{<BR> m_nNumColumns = other.GetNumColumns();<BR> m_nNumRows = other.GetNumRows();<BR> m_pData = NULL;<BR> BOOL bSuccess = Init(m_nNumRows, m_nNumColumns);<BR> ASSERT(bSuccess);<BR><BR> // copy the pointer<BR> memcpy(m_pData, other.m_pData, sizeof(double)*m_nNumColumns*m_nNumRows);<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 析构函数<BR>//////////////////////////////////////////////////////////////////////<BR>CMatrix::~CMatrix()<BR>{<BR> if (m_pData)<BR> {<BR> delete[] m_pData;<BR> m_pData = NULL;<BR> }<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 初始化函数<BR>//<BR>// 参数:<BR>// 1. int nRows - 指定的矩阵行数<BR>// 2. int nCols - 指定的矩阵列数<BR>//<BR>// 返回值:BOOL 型,初始化是否成功<BR>//////////////////////////////////////////////////////////////////////<BR>BOOL CMatrix::Init(int nRows, int nCols)<BR>{<BR> if (m_pData)<BR> {<BR> delete[] m_pData;<BR> m_pData = NULL;<BR> }<BR><BR> m_nNumRows = nRows;<BR> m_nNumColumns = nCols;<BR> int nSize = nCols*nRows;<BR> if (nSize < 0)<BR> return FALSE;<BR><BR> // 分配内存<BR> m_pData = new double[nSize];<BR> <BR> if (m_pData == NULL)<BR> return FALSE; // 内存分配失败<BR> if (IsBadReadPtr(m_pData, sizeof(double) * nSize))<BR> return FALSE;<BR><BR> // 将各元素值置0<BR> memset(m_pData, 0, sizeof(double) * nSize);<BR><BR> return TRUE;<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 将方阵初始化为单位矩阵<BR>//<BR>// 参数:<BR>// 1. int nSize - 方阵行列数<BR>//<BR>// 返回值:BOOL 型,初始化是否成功<BR>//////////////////////////////////////////////////////////////////////<BR>BOOL CMatrix::MakeUnitMatrix(int nSize)<BR>{<BR> if (! Init(nSize, nSize))<BR> return FALSE;<BR><BR> for (int i=0; i<nSize; ++i)<BR> for (int j=0; j<nSize; ++j)<BR> if (i == j)<BR> SetElement(i, j, 1);<BR><BR> return TRUE;<BR>}<BR><BR>//////////////////////////////////////////////////////////////////////<BR>// 将字符串转化为矩阵的值<BR>//<BR>// 参数:<BR>// 1. CString s - 数字和分隔符构成的字符串<BR>// 2. const CString& sDelim - 数字之间的分隔符,默认为空格<BR>// 3. BOOL bLineBreak - 行与行之间是否有回车换行符,默认为真(有换行符)<BR>// 当该参数为FALSE时,所有元素值都在一行中输入,字符串的第一个<BR>// 数值应为矩阵的行数,第二个数值应为矩阵的列数<BR>//<BR>// 返回值:BOOL 型,转换是否成功<BR>//////////////////////////////////////////////////////////////////////<BR>BOOL CMatrix::FromString(CString s, const CString& sDelim /*= " "*/, BOOL bLineBreak /*= TRUE*/)<BR>{<BR> if (s.IsEmpty())<BR> return FALSE;<BR><BR> // 分行处理<BR> if (bLineBreak)<BR> {<BR> CTokenizer tk(s, "\r\n");<BR><BR> CStringList ListRow;<BR> CString sRow;<BR> while (tk.Next(sRow))<BR> {<BR> sRow.TrimLeft();<BR> sRow.TrimRight();<BR> if (sRow.IsEmpty())<BR> break;<BR><BR> ListRow.AddTail(sRow);<BR> }<BR><BR> // 行数<BR> m_nNumRows = ListRow.GetCount();<BR><BR> sRow = ListRow.GetHead();<BR> CTokenizer tkRow(sRow, sDelim);<BR> CString sElement;<BR> // 列数<BR> m_nNumColumns = 0;<BR> while (tkRow.Next(sElement))<BR> {<BR> m_nNumColumns++;<BR> }<BR><BR> // 初始化矩阵<BR> if (! Init(m_nNumRows, m_nNumColumns))<BR> return FALSE;<BR><BR> // 设置值<BR> POSITION pos = ListRow.GetHeadPosition();<BR> for (int i=0; i<m_nNumRows; i++)<BR> {<BR> sRow = ListRow.GetNext(pos);<BR> int j = 0;<BR> CTokenizer tkRow(sRow, sDelim);<BR> while (tkRow.Next(sElement))<BR> {<BR> sElement.TrimLeft();<BR> sElement.TrimRight();<BR> double v = atof(sElement);<BR> SetElement(i, j++, v);<BR> }<BR> }<BR><BR> return TRUE;<BR> }<BR> <BR> // 不分行(单行)处理<BR><BR> CTokenizer tk(s, sDelim);<BR><BR> CString sElement;<BR> <BR> // 行数<BR> tk.Next(sElement);<BR> sElement.TrimLeft();<BR> sElement.TrimRight();<BR> m_nNumRows = atoi(sElement);<BR><BR> // 列数<BR> tk.Next(sElement);<BR> &n
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -