對稱矩陣壓縮的簡單實現 (GCC編譯)。數組
1 /** 2 * @brief C語言 對稱矩陣 壓縮 實現 3 * @author wid 4 * @date 2013-11-03 5 * 6 * @note 若代碼存在 bug 或程序缺陷, 請留言反饋, 謝謝! 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <assert.h> 12 13 #define MAT_ROW 6 14 #define MAT_COL 6 15 16 typedef int ElemType; 17 18 ///方法聲明 19 ElemType *Compress( ElemType pArr2D[][MAT_COL] ); ///壓縮二維對稱矩陣 20 ElemType Value( ElemType *pComArr, int m, int n ); ///從壓縮後的矩陣中取值 21 22 23 ///方法實現 24 /** 25 * @brief 壓縮對稱矩陣 26 * 27 * @param 待壓縮的矩陣 28 * 29 * @return 返回壓縮後線性表的指針 30 */ 31 ElemType *Compress( ElemType pArr2D[][MAT_COL] ) 32 { 33 ElemType *pMat = (ElemType *)malloc( sizeof(ElemType) * ((MAT_COL * (MAT_COL + 1)) / 2) ); 34 35 ///映射到線性表中 36 int m = 0, n = 0, nLen = 1, nPos = 0; 37 for( m = 0; m < MAT_ROW; ++m ) 38 { 39 for( n = 0; n < nLen; ++n ) 40 { 41 pMat[nPos] = pArr2D[m][n]; 42 ++nPos; 43 } 44 45 ++nLen; 46 } 47 48 return pMat; 49 } 50 51 /** 52 * @brief 從壓縮後獲得的線性表中取值 53 * 54 * @param pComArr 指向存放壓縮矩陣的線性表 55 * @param m 矩陣的第一維下標 56 * @param n 矩陣的第二維下標 57 * 58 * @return 返回該下標指向的元素值 59 * 60 * @note 元素位置由 0 計起 61 */ 62 ElemType Value( ElemType *pComArr, int m, int n ) 63 { 64 ///使用斷言 65 assert( m >= 0 && m < MAT_ROW && n >= 0 && n < MAT_COL ); 66 67 ///將0索引轉化爲1索引 68 ++m; 69 ++n; 70 71 ///根據對稱矩陣性質從壓縮一維數組中取值 72 if( m >= n ) 73 return pComArr[ (m * (m - 1)) / 2 + n - 1 ]; 74 else 75 return pComArr[ (n * (n - 1)) / 2 + m - 1 ]; 76 } 77 78 79 ///測試 80 int main() 81 { 82 ///對稱矩陣 arrMat 83 ElemType arrMat[MAT_ROW][MAT_COL] = { 84 {1, 2, 3, 4, 5, 6}, 85 {2, 2, 3, 4, 4, 5}, 86 {3, 3, 3, 4, 4, 4}, 87 {4, 4, 4, 3, 3, 3}, 88 {5, 4, 4, 3, 2, 2}, 89 {6, 5, 4, 3, 2, 1} 90 }; 91 92 ///對矩陣 arrMat 進行壓縮 93 ElemType *pCom = Compress( arrMat ); 94 95 ///從壓縮矩陣輸出整個矩陣, 使用 0 索引 96 int m = 0, n = 0; 97 for( m = 0; m < MAT_ROW; ++m ) 98 { 99 for( n = 0; n < MAT_COL; ++n ) 100 { 101 printf( "%d ", Value(pCom, m, n) ); 102 } 103 104 putchar( '\n' ); 105 } 106 107 return 0; 108 }
運行測試:測試
若代碼存在 bug 或程序缺陷, 請留言反饋, 謝謝。 spa