////////////////////////////////////////////////////////////////////// // Matrix.h // // 操作矩阵的类 CMatrix1 的声明接口 // // 编制, 2002/8 ////////////////////////////////////////////////////////////////////// #if !defined(AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_) #define AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_ #include "BaseFun.h" #include "CStringType.h" #if !defined(_BITSET_) # include #endif // !defined(_BITSET_) #ifndef BOOL #define BOOL bool #endif #ifndef TRUE #define TRUE true #endif ////////////////////////////////////////////////////////////////////////////////////// // //(-- class CTokenizer1 // class BASEFUN_EXPORT CTokenizer1 { public: CTokenizer1(const CString& cs, const CString& csDelim) : m_cs(cs), m_nCurPos(0) { SetDelimiters(csDelim); } void SetDelimiters(const CString& csDelim) { for(int i = 0; i < csDelim.GetLength(); ++i){ char * c=csDelim.GetString(); m_sDelimiter.set(static_cast(c[i])); } } BOOL Next(CString& cs) { cs.Empty(); while(m_nCurPos < m_cs.GetLength() && m_sDelimiter[static_cast(m_cs[m_nCurPos])]) ++m_nCurPos; if(m_nCurPos >= m_cs.GetLength()) return FALSE; int nStartPos = m_nCurPos; while(m_nCurPos < m_cs.GetLength() && !m_sDelimiter[static_cast(m_cs[m_nCurPos])]) ++m_nCurPos; cs = m_cs.Mid(nStartPos, m_nCurPos - nStartPos); return TRUE; } CString Tail() const { int nCurPos = m_nCurPos; char *ch=m_cs.GetString(); while(nCurPos < m_cs.GetLength()) { if(!m_sDelimiter[static_cast(ch[nCurPos])]) break; ++nCurPos; } CString csResult; if(nCurPos < m_cs.GetLength()) csResult = m_cs.Mid(nCurPos); return csResult; } private: CString m_cs; std::bitset<256> m_sDelimiter; int m_nCurPos; }; // //--) // class CTokenizer1 // ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// // //(-- class CMatrix1 // class BASEFUN_EXPORT CMatrix1 { // // 公有接口函数 // public: // // 构造与析构 // CMatrix1(); // 基础构造函数 CMatrix1(int nRows, int nCols); // 指定行列构造函数 CMatrix1(int nRows, int nCols, float value[]); // 指定数据构造函数 CMatrix1(int nSize); // 方阵构造函数 CMatrix1(int nSize, float value[]); // 指定数据方阵构造函数 CMatrix1(const CMatrix1& other); // 拷贝构造函数 BOOL Init(int nRows, int nCols); // 初始化矩阵 BOOL MakeUnitMatrix(int nSize); // 将方阵初始化为单位矩阵 virtual ~CMatrix1(); // 析构函数 // // 输入与显示 // // 将字符串转换为矩阵数据 BOOL FromString(CString s, const CString& sDelim = " ", BOOL bLineBreak = TRUE); // 将矩阵转换为字符串 CString ToString(const CString& sDelim = " ", BOOL bLineBreak = TRUE) const; // 将矩阵的指定行转换为字符串 CString RowToString(int nRow, const CString& sDelim = " ") const; // 将矩阵的指定列转换为字符串 CString ColToString(int nCol, const CString& sDelim = " ") const; // // 元素与值操作 // BOOL SetElement(int nRow, int nCol, float value); // 设置指定元素的值 float GetElement(int nRow, int nCol) const; // 获取指定元素的值 void SetData(float value[]); // 设置矩阵的值 int GetNumColumns() const; // 获取矩阵的列数 int GetNumRows() const; // 获取矩阵的行数 int GetRowVector(int nRow, float* pVector) const; // 获取矩阵的指定行矩阵 int GetColVector(int nCol, float* pVector) const; // 获取矩阵的指定列矩阵 float* GetData() const; // 获取矩阵的值 // // 数学操作 // CMatrix1& operator=(const CMatrix1& other); BOOL operator==(const CMatrix1& other) const; BOOL operator!=(const CMatrix1& other) const; CMatrix1 operator+(const CMatrix1& other) const; CMatrix1 operator-(const CMatrix1& other) const; CMatrix1 operator*(float value) const; CMatrix1 operator*(const CMatrix1& other) const; // 复矩阵乘法 BOOL CMul(const CMatrix1& AR, const CMatrix1& AI, const CMatrix1& BR, const CMatrix1& BI, CMatrix1& CR, CMatrix1& CI) const; // 矩阵的转置 CMatrix1 Transpose() const; // // 算法 // // 实矩阵求逆的全选主元高斯-约当法 BOOL InvertGaussJordan(); // 复矩阵求逆的全选主元高斯-约当法 BOOL InvertGaussJordan(CMatrix1& mtxImag); // 对称正定矩阵的求逆 BOOL InvertSsgj(); // 托伯利兹矩阵求逆的埃兰特方法 BOOL InvertTrench(); // 求行列式值的全选主元高斯消去法 float DetGauss(); // 求矩阵秩的全选主元高斯消去法 int RankGauss(); // 对称正定矩阵的乔里斯基分解与行列式的求值 BOOL DetCholesky(float* dblDet); // 矩阵的三角分解 BOOL SplitLU(CMatrix1& mtxL, CMatrix1& mtxU); // 一般实矩阵的QR分解 BOOL SplitQR(CMatrix1& mtxQ); // 一般实矩阵的奇异值分解 BOOL SplitUV(CMatrix1& mtxU, CMatrix1& mtxV, float eps = 0.000001); // 求广义逆的奇异值分解法 BOOL GInvertUV(CMatrix1& mtxAP, CMatrix1& mtxU, CMatrix1& mtxV, float eps = 0.000001); // 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法 BOOL MakeSymTri(CMatrix1& mtxQ, CMatrix1& mtxT, float dblB[], float dblC[]); // 实对称三对角阵的全部特征值与特征向量的计算 BOOL SymTriEigenv(float dblB[], float dblC[], CMatrix1& mtxQ, int nMaxIt = 60, float eps = 0.000001); // 约化一般实矩阵为赫申伯格矩阵的初等相似变换法 void MakeHberg(); // 求赫申伯格矩阵全部特征值的QR方法 BOOL HBergEigenv(float dblU[], float dblV[], int nMaxIt = 60, float eps = 0.000001); // 求实对称矩阵特征值与特征向量的雅可比法 BOOL JacobiEigenv(float dblEigenValue[], CMatrix1& mtxEigenVector, int nMaxIt = 60, float eps = 0.000001); // 求实对称矩阵特征值与特征向量的雅可比过关法 BOOL JacobiEigenv2(float dblEigenValue[], CMatrix1& mtxEigenVector, float eps = 0.000001); // // 保护性数据成员 // protected: int m_nNumColumns; // 矩阵列数 int m_nNumRows; // 矩阵行数 float* m_pData; // 矩阵数据缓冲区 // // 内部函数 // private: void ppp(float a[], float e[], float s[], float v[], int m, int n); void sss(float fg[2], float cs[2]); }; // //--) // class CMatrix1 // ////////////////////////////////////////////////////////////////////////////////////// #endif // !defined(AFX_MATRIX_H__ACEC32EA_5254_4C23_A8BD_12F9220EF43A__INCLUDED_)