zoukankan      html  css  js  c++  java
  • C语言 对称矩阵 压缩 实现

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

  • 相关阅读:
    Beta冲刺阶段
    用例图练习
    第四次作业--个人作业--必应词典案例分析
    第五次作业——团队项目——需求规格说明书
    结对编程第三次作业
    第二次作业— —结对项目
    Git使用心得
    Android平台的开发环境的发展演变
    软件工程的实践项目的自我目标
    面试中遇到的问题
  • 原文地址:https://www.cnblogs.com/mr-wid/p/3405543.html
Copyright © 2011-2022 走看看