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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!