对称矩阵压缩的简单实现 (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( ' ' ); 105 } 106 107 return 0; 108 }
运行测试:
若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢。