自己設計的 Matrix 類 V0.01 版,說明書自己使用 html 書寫,會導致排版混亂

來源:互聯網
上載者:User
文章目錄
  • 1.所有建構函式
  • 2.解構函式
  • 3.求矩陣的跡
  • 4.將矩陣轉置
  • 5.所有重載運算子
  • 6.所有功能函數和支援函數

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Matrix 類使用說明書本免費文檔提供類的使用說明
最新動向 2011.10.20

  • 概述
  • 類設計圖
  • 當前類別檢視
  • 成員函數說明
  • 應用舉例
  • 更新日誌
  • 類的擴充

一、概述1.設計原因

由於數值計算課的上機作業要求,為了減少建立成本,所以設計了一個基於標準 C++ 的 MATRIX 類。

2.設計目的

利用動態分配記憶體,運算子多載等機制,利用已經學會的內容,儘可能簡化矩陣的建立、運算等過程。

3.主要功能
  • 定義矩陣的方式:
    • MATRIX A;//建立空矩陣
    • MATRIX A(n);//建立一維矩陣,初始值為 n;
    • MATRIX A(MATRIX & B);//完全複製 B 矩陣建立 A
    • MATRIX A(MatrixType,Dimension,value1,(value2));//建立特殊矩陣(單位矩陣,對角矩陣,順序矩陣,上三角矩陣,下三角矩陣)
    • MATRIX A(MatrixType,Dimension,band);//利用 band 字串建立帶狀矩陣
  • 計算矩陣屬性,包括:
    • 行列式的值
    • 矩陣的特徵值
    • 矩陣的跡
    • 矩陣的逆
    • 矩陣的轉置
  • 矩陣運算,包括:
    • 加法
    • 減法
    • 乘法
    • 針對實數,將實數分配到矩陣的每一個元素上,所以可以進行 矩陣/實數 的運算
4.儲存方式

由於目前處理的矩陣一般不超過 500 階(約佔用 1.9 MB 記憶體空間),所以暫時使用連續記憶體儲存內容。

Δ返回頂部

二、類設計圖註:類別檢視使用 StarUML 產生。

類成員
項目 名稱 備忘
私人成員 double *Body;//the content of the matrix  
int row;//the row of the matrix  
int col;//the column of the matrix  
char type;//matrix type:I,D,P,B,U,L,E,Z,N,R  
建構函式 MATRIX();//default constructor  
MATRIX(int m,int n);//constructor  
MATRIX(const MATRIX & A);//copy constructor  
MATRIX(char t,int n,double val,int pRow=0);//I,D,U,L,P  
MATRIX(char t,int n,string & band);//B  
MATRIX(char t,int n,const char * band);//B  
MATRIX(double k);//k is a real number  
MATRIX(int k);//k is a real number  
MATRIX(int m,int n,const double * array)//use const array construct  
解構函式 ~MATRIX();//destructor  
運算子多載 MATRIX & operator +=(const MATRIX & A);  
MATRIX & operator -=(const MATRIX & A);  
MATRIX & operator *=(const MATRIX & A);  
MATRIX & operator = (const MATRIX & A);  
MATRIX & operator = (const double k);  
MATRIX & operator = (const int k);  
double & operator () (int i,int j) const;  
double & operator () (int i) const;  
功能函數 double det();//determinant  
double trace();//trace  
double lambda();  
MATRIX & inv();//inverse  
MATRIX & trans();//transposition  
支援函數 void PrintMatrix(int width);  
void Input();//input the elements' value  
void setBody(int i,int j,double val);//set Body[i*row+j]  
int Row()const{return row;}  
int Column()const{return col;}  
char MatrixType()const{return type;}  
void setAll(double val);//set all elements a same value  
void PrintBody();//print all the elements  

類外函數
項目 名稱 備忘
函數 MATRIX operator +(const MATRIX & A,const MATRIX & B);  
MATRIX operator -(const MATRIX & A,const MATRIX & B);  
MATRIX operator *(const MATRIX & A,const MATRIX & B);  
MATRIX operator /(const MATRIX & A,const MATRIX & B);  
ostream & operator <<(ostream & out,MATRIX & A);  

Δ返回頂部

三、已經完成的部分1.所有建構函式2.解構函式3.求矩陣的跡4.將矩陣轉置5.所有重載運算子6.所有功能函數和支援函數

Δ返回頂部

四、成員函數說明
  • MATRIX()
    預設建構函式,用於建立空的矩陣。矩陣類型和出錯時一樣為 E。
  • MATRIX(int m,int n)
    重載建構函式,產生 m×n 維矩陣,並初始化為零矩陣。出錯產生 E 矩陣。
  • MATRIX(const MATRIX & A)
    複製建構函式,利用 A 矩陣重新構造一個新矩陣。出錯產生 E 矩陣。
  • MATRIX(char t,int n,double val,int pRow=0)
    t 為類型,n 為階數,val 為初始化使用的值(建立單位矩陣時不起作用,順序矩陣時為第一個要替換的行),pRow 只在建立順序矩陣時表示第二個需要替換的行。
    建立特殊矩陣,包括:
    單位矩陣 I
    對角矩陣 D
    順序矩陣 P
    上三角矩陣 U
    下三角矩陣 L
  • MATRIX(char t,int n,string & band)
    t 為矩陣類型 B,n 為階數,band 為用 string 類型建立的帶,當使用者需要動態輸入帶的內容時,使用此函數。
  • MATRIX(char t,int n,const char * band)
    t 為矩陣類型 B,n 為階數,band 為用 const char * 類型建立的帶,當編程時已經確定需要的帶,即使用字串常量,使用此函數。
  • MATRIX(double k)
    將 double 類型的 k 轉換為一階實矩陣,方便參與通用的矩陣運算。
  • MATRIX(int k)
    將 int 類型的 k 轉換為一階實矩陣,方便參與通用的矩陣運算。
  • ∼MATRIX()
    解構函式,當 Body 不為空白時,釋放佔用的記憶體。
  • double det()
    尚未設計,計算矩陣的行列式值。
  • double trace()
    計算矩陣的跡。
  • double lambda()
    尚未設計,計算矩陣的特徵值。
  • MATRIX & inv()
    尚未設計,計算矩陣的逆。
  • MATRIX & trans()
    將調用它的矩陣轉置。
  • MATRIX & operator +=(const MATRIX & A)
    MATRIX & operator -=(const MATRIX & A)
    MATRIX & operator *=(const MATRIX & A)
    重載各符合賦值運算子。
  • MATRIX & operator = (const MATRIX & A)
    MATRIX & operator = (const double k)
    MATRIX & operator = (const int k)
    重載賦值運算子,分別用於將一個矩陣賦值,一個 double 類型,一個 int 類型賦值給矩陣的情況。
  • void PrintMatrix(int width)
    列印整個矩陣,兩個數之間列印一個空格,width 可以設定列印寬度,用於不整齊的矩陣輸出。
  • void Input()
    完整從標準輸入裝置(鍵盤)輸入一個矩陣的值,需要先建立再使用。
  • void setBody(int i,int j,double val)
    這是一個 MATRIX 類內部調用的函數,用於在一些重載情況重新為元素複製的情況,在一定情況下也可以用於修改矩陣某個特定元素的值。
  • int Row() const
    返回私人成員 row。
  • int Column() const
    返回私人成員 col。
  • char MatrixType() const
    返回私人成員 type。
  • void setAll(double val)
    一次性為矩陣所有元素賦予相同的值 val。
  • void PrintBody()
    以不換行的方式順序輸出 Body 的元素,每個數字緊跟一個 # 號為索引值。

Δ返回頂部

五、應用舉例常式代碼

#include "MATRIX.h"

using namespace std;
int main(int argc,char* argv[])
{
MATRIX M;
MATRIX N(3,5);
MATRIX I('I',4,20);//20 is invalid for I matrix
MATRIX U('U',10,3.5);
MATRIX L('L',10,7.5);
MATRIX P('P',10,3,6);
MATRIX B('B',8,"1,2,5,2,1");

cout<<"M:"<<endl
  <<M<<endl
  <<"N:"<<endl
  <<N<<endl
  <<"I:"<<endl
  <<I<<endl
  <<"U:"<<endl
  <<U<<endl
  <<"L:"<<endl
  <<L<<endl
  <<"P:"<<endl
  <<P<<endl
  <<"B:"<<endl
  <<B<<endl;

cout<<"L:(in PrintMatrix(3))"<<endl;
L.PrintMatrix(3);
cout<<endl<<"U:(in PrintMAtrix(3))"<<endl;
U.PrintMatrix(3);

cout<<endl<<"M=L:"<<endl;
M=L;
M.PrintMatrix(4);

cout<<endl<<"M=22.5:"<<endl;
M=22.5;
cout<<M<<endl;

cout<<endl<<"M=P*U:"<<endl;
M=P*U;
M.PrintMatrix(3);

cout<<endl<<"M=U*L:"<<endl;
M=U*L;
M.PrintMatrix(6,2,true);
cout<<"M(1,2)=20:"<<endl;
M(1,2)=20;
M.PrintMatrix(6,2,true);

cout<<"NagB:"<<endl;
MATRIX NagB('B',5,"-1,5,-1");
NagB.PrintMatrix(2);
cout<<endl;

double array[]={1,2,3,4,5,6,7,8,0,-1,2.5,0,0,0,0,0,0,0,0,0};
MATRIX vector(1,20,array);
cout<<"vector={1,2,3,4,5,6,7,8,0,-1,2.5,0,0,0,0,0,0,0,0,0}"<<endl
  <<"vector(5):"<<endl
  <<vector(5)<<endl<<endl;

MATRIX vector2(20,1,array);
MATRIX V=vector*vector2;
cout<<V;

return 0;
}

運行結果

M:

N:
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

I:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

U:
1 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5
0 1 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5
0 0 1 3.5 3.5 3.5 3.5 3.5 3.5 3.5
0 0 0 1 3.5 3.5 3.5 3.5 3.5 3.5
0 0 0 0 1 3.5 3.5 3.5 3.5 3.5
0 0 0 0 0 1 3.5 3.5 3.5 3.5
0 0 0 0 0 0 1 3.5 3.5 3.5
0 0 0 0 0 0 0 1 3.5 3.5
0 0 0 0 0 0 0 0 1 3.5
0 0 0 0 0 0 0 0 0 1

L:
1 0 0 0 0 0 0 0 0 0
7.5 1 0 0 0 0 0 0 0 0
7.5 7.5 1 0 0 0 0 0 0 0
7.5 7.5 7.5 1 0 0 0 0 0 0
7.5 7.5 7.5 7.5 1 0 0 0 0 0
7.5 7.5 7.5 7.5 7.5 1 0 0 0 0
7.5 7.5 7.5 7.5 7.5 7.5 1 0 0 0
7.5 7.5 7.5 7.5 7.5 7.5 7.5 1 0 0
7.5 7.5 7.5 7.5 7.5 7.5 7.5 7.5 1 0
7.5 7.5 7.5 7.5 7.5 7.5 7.5 7.5 7.5 1

P:
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1

B:
5 2 1 0 0 0 0 0
2 5 2 1 0 0 0 0
1 2 5 2 1 0 0 0
0 1 2 5 2 1 0 0
0 0 1 2 5 2 1 0
0 0 0 1 2 5 2 1
0 0 0 0 1 2 5 2
0 0 0 0 0 1 2 5

L:(in PrintMatrix(3))
1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00

U:(in PrintMAtrix(3))
1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00

M=L:
1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00 0.00
7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 7.50 1.00

M=22.5:
22.50

M=P*U:
1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50
0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50
0.00 0.00 1.00 3.50 3.50 3.50 3.50 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 3.50
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00

M=U*L:
237.25 213.50 187.25 161.00 134.75 108.50  82.25  56.00  29.75   3.50
217.50 211.00 187.25 161.00 134.75 108.50  82.25  56.00  29.75   3.50
191.25 191.25 184.75 161.00 134.75 108.50  82.25  56.00  29.75   3.50
165.00 165.00 165.00 158.50 134.75 108.50  82.25  56.00  29.75   3.50
138.75 138.75 138.75 138.75 132.25 108.50  82.25  56.00  29.75   3.50
112.50 112.50 112.50 112.50 112.50 106.00  82.25  56.00  29.75   3.50
 86.25  86.25   86.25  86.25  86.25  86.25  79.75  56.00  29.75   3.50
 60.00  60.00  60.00  60.00  60.00  60.00  60.00  53.50  29.75   3.50
 33.75  33.75  33.75  33.75  33.75  33.75  33.75  33.75  27.25   3.50
  7.50   7.50   7.50   7.50   7.50   7.50   7.50   7.50   7.50   1.00
M(1,2)=20:
237.25  20.00 187.25 161.00 134.75 108.50  82.25  56.00  29.75   3.50
217.50 211.00 187.25 161.00 134.75 108.50  82.25  56.00  29.75   3.50
191.25 191.25 184.75 161.00 134.75 108.50  82.25  56.00  29.75   3.50
165.00 165.00 165.00 158.50 134.75 108.50  82.25  56.00  29.75   3.50
138.75 138.75 138.75 138.75 132.25 108.50  82.25  56.00  29.75   3.50
112.50 112.50 112.50 112.50 112.50 106.00  82.25  56.00  29.75   3.50
 86.25  86.25  86.25  86.25  86.25  86.25  79.75  56.00  29.75   3.50
 60.00  60.00  60.00  60.00  60.00  60.00  60.00  53.50  29.75   3.50
 33.75  33.75  33.75  33.75  33.75  33.75  33.75  33.75  27.25   3.50
  7.50   7.50   7.50   7.50   7.50   7.50   7.50   7.50   7.50   1.00
NagB:
5.00 -1.00 0.00 0.00 0.00
-1.00 5.00 -1.00 0.00 0.00
0.00 -1.00 5.00 -1.00 0.00
0.00 0.00 -1.00 5.00 -1.00
0.00 0.00 0.00 -1.00 5.00

vector={1,2,3,4,5,6,7,8,0,-1,2.5,0,0,0,0,0,0,0,0,0}
vector(5):
5.00

211.25
Process returned 0 (0x0)   execution time : 0.641 s
Press any key to continue.

Δ返回頂部

六、更新日誌
  • 2011.10.21

    • 修正了帶狀矩陣不能處理負數的情況
    • 增加了通過先定義 double 數組來初始化矩陣的建構函式,引入對應的 BUG
    • 將重載運算子 () 傳回值修改為 Body 的引用,這樣可以使用 A(i,j)=A(m,l)+C;的式子
    • 發現乘法中存在一個很大的 BUG,已經修正
  • 2011.10.20
    • MATRIX 已在上午能夠正常工作
    • 為了增強互動能力,又增加使用字串常量構造帶狀矩陣的建構函式
    • 重載流輸出運算子 >>
    • 開始使用 html 書寫類使用說明書
  • 2011.10.19
    • 經過一夜的思考開始設計,MATRIX 類架構初步提出
    • 設計完類的主要函數,類外主要成員函數
    • 晚上已經能夠完成加減乘除基本運算
  • 2011.10.18
    • 數值計算課得知更推薦使用 C++ 完成上機作業
    • 開始設計 MATRIX 類,初步打算應當在編程的時候具有和 MATLAB 類似的方便程度

Δ返回頂部

七、類的擴充

    由於 MATRIX 類的設計初衷只是為了減輕同學們(包括我自己)在完成作業時的困難程度,所以類本身只是一個基礎架構,能夠良好的建立和管理需要的矩陣。真正的計算,諸如 Gauss 消去法,Jacobi 迭代,Gauss-Seidel 迭代等並沒有設計在最初的 MATRIX 矩陣類當中,但是考慮將在會增加這些功能為內建函式。

    另外,限於所學知識,MATRIX 並沒有設計計算矩陣行列式值,特徵值,逆等功能,但是已經為將來的功能留下了介面。

    初版 MATRIX 類只使用動態數組連續記憶體儲存資料,可以預見,這種儲存方式對高階矩陣的計算局限性很大,學習資料結構後將考慮新的資料儲存方式。由於演算法和資料結構聯絡緊密,採用新的資料結構很可能需要重寫整個演算法,所以在擴充資料結構時應當十分小心。

Δ返回頂部

八、BUGs Report可能存在的 BUG

帶狀矩陣中沒有對Null 字元串,重複負號,重複逗號等做檢查,可以考慮寫一個將字串標準化的函數。

Copyright by 天籟梓軒 from school of Mathematics

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.