Nacho:一个轻量级的C++矩阵运算类库
jopen
9年前
项目背景
从连通性的角度为一个管道网络建立数学模型其实很简单:
把 A 称为该管网的连通矩阵。从定义中可以看出管网在这里被视为单向图。
根据节点质量守恒定律,在供水管网的每一个节点,流入该节点的质量应等于流出该节点的质量,从而可以建立整个管网的节点流量平衡方程组:
这个方程组就是供水管网水力分析的基础。
这是水力分析程序的整体架构:
在计算过程中用到大量矩阵的加法、减法、乘法、转置等运算。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也包括在开源项目中。