Nacho:一個輕量級的C++矩陣運算類庫

jopen 9年前發布 | 9K 次閱讀 Nacho C/C++開發

項目背景

從連通性的角度為一個管道網絡建立數學模型其實很簡單:

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也包括在開源項目中。

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