文章目錄
- 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