前言 :
數學的矩陣 (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 代碼 :
* ch02.cpp 代碼 :
* 矩陣相加範例代碼 :
* 矩陣相乘範例代碼 :
執行結果 :
- 矩陣相加 :
- 矩陣相乘 :
數學的矩陣 (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 代碼 :
- #include
- using namespace std;
- const int ROWS = 3;
- const int COLS = 3;
- /*
- * As ch01_01.cpp
- * Do matrix add A + B = C
- */
- void MatrixAdd(int* matrixA, int* matrixB, int* matrixC, int maxRows, int maxCols);
- /*
- * As ch02_02.cpp
- * Do matrix multiply A(MxN) * B(NxP) = C(MxP)
- */
- void MatrixMultiply(int* matrixA, int* matrixB, int* matrixC, int M, int N, int P);
- #include "ch02.h"
- void MatrixAdd(int* matrixA, int* matrixB, int* matrixC, int maxRows, int maxCols) {
- //Do matrix adding A+B=C
- if(maxRows <0 || maxCols <0) {
- cout << "矩陣維數須大於零!" << endl;
- }
- for(int row = 1; row <= maxRows; row++)
- for(int col=1; col <= maxCols; col++)
- matrixC[(row-1)*maxCols+(col-1)] = matrixA[(row-1)*maxCols+(col-1)] + matrixB[(row-1)*maxCols+(col-1)];
- }
- void MatrixMultiply(int* matrixA, int* matrixB, int* matrixC, int M, int N, int P) {
- //Do matrix multiply A(MxN) * B(NxP) = C(MxP)
- if(M <=0 || N <=0 || P <=0) {
- cout << "[ 錯誤: 維數M, N, P 必須大於0 ]" << endl;
- return;
- }
- for(int i=0; i
- for(int j=0; j
- matrixC[i*P + j] = 0;
- for(int k=0; k
- matrixC[i*P + j] += matrixA[i*N + k] * matrixB[k*P + j];
- }
- }
- int A[ROWS][COLS] = {{1,3,5},{7,9,11},{13,15,17}};
- int B[ROWS][COLS] = {{9,8,7},{6,5,4},{3,2,1}};
- int C[ROWS][COLS] = {0};
- cout << "[矩陣A的各個元素] " << endl;
- for(int i=0; i
- for(int j=0;j
- cout << A[i][j] << "\t";
- cout << endl;
- }
- cout << "[矩陣B的各個元素] " << endl;
- for(int i=0; i
- for(int j=0;j
- cout << B[i][j] << "\t";
- cout << endl;
- }
- MatrixAdd(&A[0][0],&B[0][0],&C[0][0],ROWS,COLS);
- cout << "[顯示矩陣A與矩陣B相加後結果] " << endl;
- for(int i=0; i
- for(int j=0;j
- cout << C[i][j] << "\t";
- cout << endl;
- }
- int M,N,P;
- //矩陣A 部分
- cout << "請輸入矩陣A 的維數 (MxN): " << endl;
- cout << "M= ";
- cin >> M;
- cout << "N= ";
- cin >> N;
- int *A = new int[M*N];
- cout << "[ 請輸入矩陣A 的元素 ]" << endl;
- for(int i=0; i
- for(int j=0; j< N; j++) {
- cout << "a" << i << j << "=";
- cin >> A[i*N + j];
- }
- cout << "請輸入矩陣B 的維數 (NxP): " << endl;
- cout << "P= ";
- cin >> P;
- int *B = new int[N*P];
- cout << "[ 請輸入矩陣B 的元素 ]" << endl;
- for(int i=0; i
- for(int j=0; j< P; j++) {
- cout << "b" << i << j << "=";
- cin >> B[i*P + j];
- }
- int *C = new int[M*P];
- MatrixMultiply(A,B,C,M,N,P);
- cout << "[ AxB 的結果是 ]" << endl;
- for(int i=0;i
- for(int j=0;j
- cout << C[i*P + j] << "\t" ;
- cout << endl;
- }
執行結果 :
- 矩陣相加 :
- 矩陣相乘 :
This message was edited 6 times. Last update was at 16/03/2010 15:53:31
沒有留言:
張貼留言