Matrix.h
上传用户:weigute
上传日期:2007-03-02
资源大小:1287k
文件大小:6k
源码类别:

数学计算

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // Matrix.h
  3. //
  4. // 操作矩阵的类 CMatrix 的声明接口
  5. //
  6. // 周长发编制, 2002/8
  7. //////////////////////////////////////////////////////////////////////
  8. #if !defined(AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_)
  9. #define AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_
  10. #if _MSC_VER > 1000
  11. #pragma once
  12. #endif // _MSC_VER > 1000
  13. #include <math.h>
  14. #if !defined(_BITSET_)
  15. # include <bitset>
  16. #endif // !defined(_BITSET_)
  17. //////////////////////////////////////////////////////////////////////////////////////
  18. //
  19. //(-- class CTokenizer
  20. //
  21. class CTokenizer
  22. {
  23. public:
  24. CTokenizer(const CString& cs, const CString& csDelim) : m_cs(cs), m_nCurPos(0)
  25. {
  26. SetDelimiters(csDelim);
  27. }
  28. void SetDelimiters(const CString& csDelim)
  29. {
  30. for(int i = 0; i < csDelim.GetLength(); ++i)
  31. m_sDelimiter.set(static_cast<BYTE>(csDelim[i]));
  32. }
  33. BOOL Next(CString& cs)
  34. {
  35. cs.Empty();
  36. while(m_nCurPos < m_cs.GetLength() && m_sDelimiter[static_cast<BYTE>(m_cs[m_nCurPos])])
  37. ++m_nCurPos;
  38. if(m_nCurPos >= m_cs.GetLength())
  39. return FALSE;
  40. int nStartPos = m_nCurPos;
  41. while(m_nCurPos < m_cs.GetLength() && !m_sDelimiter[static_cast<BYTE>(m_cs[m_nCurPos])])
  42. ++m_nCurPos;
  43. cs = m_cs.Mid(nStartPos, m_nCurPos - nStartPos);
  44. return TRUE;
  45. }
  46. CString Tail() const
  47. {
  48. int nCurPos = m_nCurPos;
  49. while(nCurPos < m_cs.GetLength() && m_sDelimiter[static_cast<BYTE>(m_cs[nCurPos])])
  50. ++nCurPos;
  51. CString csResult;
  52. if(nCurPos < m_cs.GetLength())
  53. csResult = m_cs.Mid(nCurPos);
  54. return csResult;
  55. }
  56. private:
  57. CString m_cs;
  58. std::bitset<256> m_sDelimiter;
  59. int m_nCurPos;
  60. };
  61. //
  62. //--) // class CTokenizer
  63. //
  64. //////////////////////////////////////////////////////////////////////////////////////
  65. //////////////////////////////////////////////////////////////////////////////////////
  66. //
  67. //(-- class CMatrix
  68. //
  69. class CMatrix  
  70. {
  71. //
  72. // 公有接口函数
  73. //
  74. public:
  75. //
  76. // 构造与析构
  77. //
  78. CMatrix(); // 基础构造函数
  79. CMatrix(int nRows, int nCols); // 指定行列构造函数
  80. CMatrix(int nRows, int nCols, double value[]); // 指定数据构造函数
  81. CMatrix(int nSize); // 方阵构造函数
  82. CMatrix(int nSize, double value[]); // 指定数据方阵构造函数
  83. CMatrix(const CMatrix& other); // 拷贝构造函数
  84. BOOL Init(int nRows, int nCols); // 初始化矩阵
  85. BOOL MakeUnitMatrix(int nSize); // 将方阵初始化为单位矩阵
  86. virtual ~CMatrix(); // 析构函数
  87. //
  88. // 输入与显示
  89. //
  90. // 将字符串转换为矩阵数据
  91. BOOL FromString(CString s, const CString& sDelim = " ", BOOL bLineBreak = TRUE);
  92. // 将矩阵转换为字符串
  93. CString ToString(const CString& sDelim = " ", BOOL bLineBreak = TRUE) const;
  94. // 将矩阵的指定行转换为字符串
  95. CString RowToString(int nRow, const CString& sDelim = " ") const;
  96. // 将矩阵的指定列转换为字符串
  97. CString ColToString(int nCol, const CString& sDelim = " ") const;
  98. //
  99. // 元素与值操作
  100. //
  101. BOOL SetElement(int nRow, int nCol, double value); // 设置指定元素的值
  102. double GetElement(int nRow, int nCol) const; // 获取指定元素的值
  103. void    SetData(double value[]); // 设置矩阵的值
  104. int GetNumColumns() const; // 获取矩阵的列数
  105. int GetNumRows() const; // 获取矩阵的行数
  106. int     GetRowVector(int nRow, double* pVector) const; // 获取矩阵的指定行矩阵
  107. int     GetColVector(int nCol, double* pVector) const; // 获取矩阵的指定列矩阵
  108. double* GetData() const; // 获取矩阵的值
  109. //
  110. // 数学操作
  111. //
  112. CMatrix& operator=(const CMatrix& other);
  113. BOOL operator==(const CMatrix& other) const;
  114. BOOL operator!=(const CMatrix& other) const;
  115. CMatrix operator+(const CMatrix& other) const;
  116. CMatrix operator-(const CMatrix& other) const;
  117. CMatrix operator*(double value) const;
  118. CMatrix operator*(const CMatrix& other) const;
  119. // 复矩阵乘法
  120. BOOL CMul(const CMatrix& AR, const CMatrix& AI, const CMatrix& BR, const CMatrix& BI, CMatrix& CR, CMatrix& CI) const;
  121. // 矩阵的转置
  122. CMatrix Transpose() const;
  123. //
  124. // 算法
  125. //
  126. // 实矩阵求逆的全选主元高斯-约当法
  127. BOOL InvertGaussJordan();                                               
  128. // 复矩阵求逆的全选主元高斯-约当法
  129. BOOL InvertGaussJordan(CMatrix& mtxImag);                                 
  130. // 对称正定矩阵的求逆
  131. BOOL InvertSsgj();                                              
  132. // 托伯利兹矩阵求逆的埃兰特方法
  133. BOOL InvertTrench();                                                    
  134. // 求行列式值的全选主元高斯消去法
  135. double DetGauss();                                                              
  136. // 求矩阵秩的全选主元高斯消去法
  137. int RankGauss();
  138. // 对称正定矩阵的乔里斯基分解与行列式的求值
  139. BOOL DetCholesky(double* dblDet);                                                               
  140. // 矩阵的三角分解
  141. BOOL SplitLU(CMatrix& mtxL, CMatrix& mtxU);                                     
  142. // 一般实矩阵的QR分解
  143. BOOL SplitQR(CMatrix& mtxQ);                                                      
  144. // 一般实矩阵的奇异值分解
  145. BOOL SplitUV(CMatrix& mtxU, CMatrix& mtxV, double eps = 0.000001);                                       
  146. // 求广义逆的奇异值分解法
  147. BOOL GInvertUV(CMatrix& mtxAP, CMatrix& mtxU, CMatrix& mtxV, double eps = 0.000001);
  148. // 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法
  149. BOOL MakeSymTri(CMatrix& mtxQ, CMatrix& mtxT, double dblB[], double dblC[]);
  150. // 实对称三对角阵的全部特征值与特征向量的计算
  151. BOOL SymTriEigenv(double dblB[], double dblC[], CMatrix& mtxQ, int nMaxIt = 60, double eps = 0.000001);
  152. // 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
  153. void MakeHberg();
  154. // 求赫申伯格矩阵全部特征值的QR方法
  155. BOOL HBergEigenv(double dblU[], double dblV[], int nMaxIt = 60, double eps = 0.000001);
  156. // 求实对称矩阵特征值与特征向量的雅可比法
  157. BOOL JacobiEigenv(double dblEigenValue[], CMatrix& mtxEigenVector, int nMaxIt = 60, double eps = 0.000001);
  158. // 求实对称矩阵特征值与特征向量的雅可比过关法
  159. BOOL JacobiEigenv2(double dblEigenValue[], CMatrix& mtxEigenVector, double eps = 0.000001);
  160. //
  161. // 保护性数据成员
  162. //
  163. protected:
  164. int m_nNumColumns; // 矩阵列数
  165. int m_nNumRows; // 矩阵行数
  166. double* m_pData; // 矩阵数据缓冲区
  167. //
  168. // 内部函数
  169. //
  170. private:
  171. void ppp(double a[], double e[], double s[], double v[], int m, int n);
  172. void sss(double fg[2], double cs[2]);
  173. };
  174. //
  175. //--) // class CMatrix
  176. //
  177. //////////////////////////////////////////////////////////////////////////////////////
  178. #endif // !defined(AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_)