• 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 或程序缺陷, 请留言反馈, 谢谢。                                                                                                                                                                                                                                                                                                                                                            

  • 相关阅读:
    兼容利器之X-UA-Compatible
    SQL Server之游标的基础知识
    SQL 按特定字段值排序
    NodeJS 开篇 牛刀小试
    临时表之IF-ELSE
    css中如何设置字体
    怎么做到不加班?
    C# .net中cookie值为中文时的乱码解决方法
    HTML5商城开发一 楼层滚动加载数据
    QQ浏览器X5内核问题汇总
  • 原文地址:https://www.cnblogs.com/mr-wid/p/3405543.html
Copyright © 2020-2023  润新知