前言 :
稀疏矩陣最簡單的定義就是一個矩陣中大部分的元素為0, 即可以稱為稀疏矩陣 (Sparse Matrix). 例如下列的4x4矩陣就是相當典型的稀疏矩陣 :
如果直接使用傳統二維矩陣來儲存稀疏矩陣會有許多元素都是0. 這樣就會十分浪費記憶體空間. 而改進空間浪費的方法就是利用三項式的資料結構. 我們把每一個非零項目以 (I, j, item-value) 來表示. 更詳細的形容就是如果有一稀疏矩陣有 n 個非零項目, 那麼就可以利用一個 A(0,n, 1:3) 的二維矩陣來表示. 參考如下 :
範例代碼 :
* ch02.h 代碼 :
* ch02.cpp 代碼 :
* 呼叫演算法範例代碼 :
執行結果 :
稀疏矩陣最簡單的定義就是一個矩陣中大部分的元素為0, 即可以稱為稀疏矩陣 (Sparse Matrix). 例如下列的4x4矩陣就是相當典型的稀疏矩陣 :
如果直接使用傳統二維矩陣來儲存稀疏矩陣會有許多元素都是0. 這樣就會十分浪費記憶體空間. 而改進空間浪費的方法就是利用三項式的資料結構. 我們把每一個非零項目以 (I, j, item-value) 來表示. 更詳細的形容就是如果有一稀疏矩陣有 n 個非零項目, 那麼就可以利用一個 A(0,n, 1:3) 的二維矩陣來表示. 參考如下 :
範例代碼 :
* ch02.h 代碼 :
- /**
- * As ch02_04.cpp
- * Compress matrix into 稀疏矩陣cmatrix
- */
- void genSparseMatrix(int* matrix, int* cmatrix, int M, int N);
- void genSparseMatrix(int* matrix, int* cmatrix, int M, int N) {
- //Calculate how many not-zero cell in matrix
- if(M<=0 || N <=0) {
- cout << "[ 錯誤:矩陣維數不可以小於等於0 ]" << endl;
- }
- //int iNotZero = _notZeroCount(matrix, M, N);
- //cmatrix = new int[(iNotZero+1)*3];
- int row=1;
- for(int i=0; i
- for(int j=0; j
- if(matrix[i*N + j]!=0){
- cmatrix[row*3] = i+1;
- cmatrix[row*3 + 1] = j+1;
- cmatrix[row*3 + 2] = matrix[i*N + j];
- row++;
- }
- }
- }
- /*
- * 計算某個矩陣非零值的個數
- */
- int _notZeroCount(int* matrix, int M, int N){
- int count =0;
- for(int i=0; i
- for(int j=0; j
- if(matrix[i*N + j]!=0)
- count++;
- }
- return count;
- }
- void ch02_04(bool b) {
- if(b) {
- int M,N;
- cout << "[ 請輸入MxN 矩陣的維度 ]" << endl;
- cout << "請輸入維度M: ";
- cin >> M;
- cout << "請輸入維度N: ";
- cin >> N;
- int *arrA = new int[M*N];
- _setMatrix(arrA, M, N);
- _showMatrix("[ 輸入矩陣內容為 ]",arrA, M, N);
- int iNotZero = _notZeroCount(arrA, M, N);
- int *comprMatrix = new int[(iNotZero+1)*3];
- comprMatrix[0] = M;
- comprMatrix[1] = N;
- comprMatrix[2] = iNotZero;
- genSparseMatrix(arrA, comprMatrix, M, N);
- _showMatrix("[ 壓縮矩陣內容為 ]", comprMatrix, comprMatrix[2]+1, 3);
- }
- }
執行結果 :
This message was edited 3 times. Last update was at 20/03/2010 11:40:20
沒有留言:
張貼留言