Nacho:一個輕量級的C++矩陣運算類庫
項目背景
從連通性的角度為一個管道網絡建立數學模型其實很簡單:
把 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也包括在開源項目中。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!