2010年8月8日 星期日

[ 資料結構 小學堂 ] 陣列結構 : 矩陣的簡介與運算


前言 :
數學的矩陣 (Matrix) 是一種用來描述二為陣列的最好方式. 例如 A 為 3*3 矩陣, 也就是有 3列及3行, 如同下列矩陣 :


由上面描述的 A 矩陣是否想到可以宣告一個 A(1:3,1:3) 的二維陣列. 所以許多矩陣的運算與應用, 都是可以使用電腦中的二維陣列解決, 例如討論到兩個矩陣的相加, 相乘或是某些稀疏矩陣 (Sparse Matrix), 轉置矩陣, 上三角與下三角矩陣等等.

矩陣相加 :
首先兩個矩陣的列數與行數必須相等, 而相加後矩陣列數與行數也是相同. 例如 Amxn+Bmxn=Cmxn. 底下為實際一個矩陣相加的例子 :


有關矩陣的加法, 利用單存的二維陣列即可解決, 其實還有一些特別的矩陣形式, 在電腦使用二維陣列儲存必須再做某些修正與調整.

矩陣相乘 :
談到兩個矩陣A 與 B 的相乘, 是有某些限制. 首先必須符合 A 為一個 mxn 的矩陣, 且B 為一個 nxp 的矩陣, 對 AxB 之後的結果為一個 mxp 的矩陣 C. 參考如下圖 :


範例代碼 :
* ch02.h 代碼 :
  1. #include   
  2. using namespace std;  
  3.   
  4. const int ROWS = 3;  
  5. const int COLS = 3;  
  6.   
  7. /* 
  8. * As ch01_01.cpp 
  9. * Do matrix add A + B = C 
  10. */  
  11. void MatrixAdd(int* matrixA, int* matrixB, int* matrixC, int maxRows, int maxCols);  
  12.   
  13. /* 
  14. * As ch02_02.cpp 
  15. * Do matrix multiply A(MxN) * B(NxP) = C(MxP) 
  16. */  
  17. void MatrixMultiply(int* matrixA, int* matrixB, int* matrixC, int M, int N, int P);  
* ch02.cpp 代碼 :
  1. #include "ch02.h"  
  2.   
  3. void MatrixAdd(int* matrixA, int* matrixB, int* matrixC, int maxRows, int maxCols) {  
  4.     //Do matrix adding A+B=C  
  5.     if(maxRows <0 || maxCols <0) {  
  6.         cout << "矩陣維數須大於零!" << endl;  
  7.     }  
  8.     for(int row = 1; row <= maxRows; row++)  
  9.         for(int col=1; col <= maxCols; col++)  
  10.             matrixC[(row-1)*maxCols+(col-1)] = matrixA[(row-1)*maxCols+(col-1)] + matrixB[(row-1)*maxCols+(col-1)];   
  11. }  
  12.   
  13. void MatrixMultiply(int* matrixA, int* matrixB, int* matrixC, int M, int N, int P) {  
  14.     //Do matrix multiply A(MxN) * B(NxP) = C(MxP)  
  15.     if(M <=0 || N <=0 || P <=0) {  
  16.         cout << "[ 錯誤: 維數M, N, P 必須大於0 ]" << endl;  
  17.         return;  
  18.     }  
  19.     for(int i=0; i
  20.         for(int j=0; j
  21.             matrixC[i*P + j] = 0;  
  22.             for(int k=0; k
  23.                 matrixC[i*P + j] +=  matrixA[i*N + k] * matrixB[k*P + j];              
  24.         }  
  25. }  
* 矩陣相加範例代碼 :
  1. int A[ROWS][COLS] = {{1,3,5},{7,9,11},{13,15,17}};  
  2. int B[ROWS][COLS] = {{9,8,7},{6,5,4},{3,2,1}};  
  3. int C[ROWS][COLS] = {0};  
  4. cout << "[矩陣A的各個元素] " << endl;  
  5. for(int i=0; i
  6.     for(int j=0;j
  7.         cout << A[i][j] << "\t";  
  8.         cout << endl;  
  9.     }  
  10. cout << "[矩陣B的各個元素] " << endl;  
  11. for(int i=0; i
  12.     for(int j=0;j
  13.         cout << B[i][j] << "\t";  
  14.         cout << endl;  
  15.     }  
  16. MatrixAdd(&A[0][0],&B[0][0],&C[0][0],ROWS,COLS);  
  17. cout << "[顯示矩陣A與矩陣B相加後結果] " << endl;  
  18. for(int i=0; i
  19.     for(int j=0;j
  20.         cout << C[i][j] << "\t";  
  21.     cout << endl;  
  22. }  
* 矩陣相乘範例代碼 :
  1. int M,N,P;  
  2. //矩陣A 部分  
  3. cout << "請輸入矩陣A 的維數 (MxN): " << endl;  
  4. cout << "M= ";  
  5. cin >> M;  
  6. cout << "N= ";  
  7. cin >> N;  
  8. int *A = new int[M*N];  
  9. cout << "[ 請輸入矩陣A 的元素 ]" << endl;  
  10. for(int i=0; i
  11.     for(int j=0; j< N; j++) {  
  12.         cout << "a" << i << j << "=";  
  13.         cin >> A[i*N + j];  
  14.     }  
  15. cout << "請輸入矩陣B 的維數 (NxP): " << endl;  
  16. cout << "P= ";  
  17. cin >> P;  
  18. int *B = new int[N*P];  
  19. cout << "[ 請輸入矩陣B 的元素 ]" << endl;  
  20. for(int i=0; i
  21.     for(int j=0; j< P; j++) {  
  22.                     cout << "b" << i << j << "=";  
  23.         cin >> B[i*P + j];  
  24.     }  
  25. int *C = new int[M*P];  
  26. MatrixMultiply(A,B,C,M,N,P);   
  27. cout << "[ AxB 的結果是 ]" << endl;  
  28. for(int i=0;i
  29.     for(int j=0;j
  30.          cout << C[i*P + j] << "\t" ;  
  31.                 cout << endl;  
  32. }  

執行結果 :
- 矩陣相加 :
[矩陣A的各個元素]
1 3 5
7 9 11
13 15 17
[矩陣B的各個元素]
9 8 7
6 5 4
3 2 1
[顯示矩陣A與矩陣B相加後結果]
10 11 12
13 14 15
16 17 18

- 矩陣相乘 :
請輸入矩陣A 的維數 (MxN):
M= 2
N= 3
[ 請輸入矩陣A 的元素 ]
a00=3
a01=3
a02=3
a10=5
a11=5
a12=5
請輸入矩陣B 的維數 (NxP):
P= 2
[ 請輸入矩陣B 的元素 ]
b00=1
b01=2
b10=3
b11=4
b20=5
b21=6
[ AxB 的結果是 ]
27 36
45 60
This message was edited 6 times. Last update was at 16/03/2010 15:53:31

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...