Nacho:一个轻量级的C++矩阵运算类库

jopen 9年前

项目背景

从连通性的角度为一个管道网络建立数学模型其实很简单:

Nacho:一个轻量级的C++矩阵运算类库

把 A 称为该管网的连通矩阵。从定义中可以看出管网在这里被视为单向图。

根据节点质量守恒定律,在供水管网的每一个节点,流入该节点的质量应等于流出该节点的质量,从而可以建立整个管网的节点流量平衡方程组:

                                Nacho:一个轻量级的C++矩阵运算类库

Nacho:一个轻量级的C++矩阵运算类库

这个方程组就是供水管网水力分析的基础。

这是水力分析程序的整体架构:

Nacho:一个轻量级的C++矩阵运算类库

在计算过程中用到大量矩阵的加法、减法、乘法、转置等运算。Nacho就是为了满足这些计算需求而被设计的。



设计思想

采用面向对象的设计模式,将矩阵封装成一个CMatrix类,矩阵的转置、求范数、置零等操作由CMatrix的成员方法提供,然后通过定义“+”,“-”,“*”,“/”,“^”等操作符来完成矩阵的加、减、乘、除以及元素求幂等运算,最后单独定义了CMatrix的控制台输出操作符,可以方便的把矩阵打印出来。

下面给出CMatrix的定义:

// CMatrix.h     #ifndef CMATRIX_H  #define CMATRIX_H     #include <iostream>  using namespace std;     class CMatrix {     public:                    CMatrix(int m, int n);         //构建一个m*n的全零矩阵                  CMatrix(int n);                //构建一个n*n的全零矩阵                       CMatrix(const CMatrix &);      //拷贝构造函数,深拷贝                            ~CMatrix();         static bool printWhenCreateAndDelete;    //控制是否打印构造与析构         int getRowNum() const;             //返回矩阵的行数      int getColNum() const;             //返回矩阵的列数      bool getTransState() const;        //返回矩阵的转置状态         CMatrix trans() const;                     //将矩阵转置      double norm() const;                       //求解矩阵F范数      double get(int i, int j) const;            //返回矩阵第i行j列元素      void set(int i, int j, double val);        //设置矩阵第i行j列元素为val      void diagUnitize();                        //将方阵对角线元素全部设置为1      void clear();                              //将矩阵所有元素设置为零         CMatrix operator +(const CMatrix &mat);        //两个矩阵相加      CMatrix operator -(const CMatrix &mat);        //两个矩阵相减      CMatrix operator *(const CMatrix &mat);        //两个矩阵相乘      CMatrix operator *(const double f);            //矩阵乘以常数      CMatrix operator /(const double f);            //矩阵除以常数      CMatrix operator ^(const double f);            //矩阵元素分别求幂      void operator =(const CMatrix &mat);           //将一个矩阵赋给另一个     private:         double *start;     //指向矩阵首元素的指针      int rowNum;        //矩阵行数      int colNum;        //矩阵列数         bool isTransposed; //记录矩阵是否转置      void rowColSwap(); //转置时用于交换row_num与col_num的值  };     //在控制台以规范的格式打印矩阵  ostream & operator <<(ostream &, const CMatrix &);     #endif

开源项目

项目地址:https://github.com/lbbc1117/Nacho

项目中包含了简单的API文档。

我还另外定义了一个CTest类,里面包含了不同的方法,对CMatrix各种运算进行测试,并将测试结果输出到控制台。

CTest也包括在开源项目中。