代码改变世界

C语言 对称矩阵 压缩 实现

2013-11-03 22:06  wid  阅读(4793)  评论(0编辑  收藏  举报

对称矩阵压缩的简单实现 (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 或程序缺陷, 请留言反馈, 谢谢。