对称矩阵压缩的简单实现 (GCC编译)。

 /**
* @brief C语言 对称矩阵 压缩 实现
* @author wid
* @date 2013-11-03
*
* @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!
*/ #include <stdio.h>
#include <stdlib.h>
#include <assert.h> #define MAT_ROW 6
#define MAT_COL 6 typedef int ElemType; ///方法声明
ElemType *Compress( ElemType pArr2D[][MAT_COL] ); ///压缩二维对称矩阵
ElemType Value( ElemType *pComArr, int m, int n ); ///从压缩后的矩阵中取值 ///方法实现
/**
* @brief 压缩对称矩阵
*
* @param 待压缩的矩阵
*
* @return 返回压缩后线性表的指针
*/
ElemType *Compress( ElemType pArr2D[][MAT_COL] )
{
ElemType *pMat = (ElemType *)malloc( sizeof(ElemType) * ((MAT_COL * (MAT_COL + )) / ) ); ///映射到线性表中
int m = , n = , nLen = , nPos = ;
for( m = ; m < MAT_ROW; ++m )
{
for( n = ; n < nLen; ++n )
{
pMat[nPos] = pArr2D[m][n];
++nPos;
} ++nLen;
} return pMat;
} /**
* @brief 从压缩后得到的线性表中取值
*
* @param pComArr 指向存放压缩矩阵的线性表
* @param m 矩阵的第一维下标
* @param n 矩阵的第二维下标
*
* @return 返回该下标指向的元素值
*
* @note 元素位置由 0 计起
*/
ElemType Value( ElemType *pComArr, int m, int n )
{
///使用断言
assert( m >= && m < MAT_ROW && n >= && n < MAT_COL ); ///将0索引转化为1索引
++m;
++n; ///根据对称矩阵性质从压缩一维数组中取值
if( m >= n )
return pComArr[ (m * (m - )) / + n - ];
else
return pComArr[ (n * (n - )) / + m - ];
} ///测试
int main()
{
///对称矩阵 arrMat
ElemType arrMat[MAT_ROW][MAT_COL] = {
{, , , , , },
{, , , , , },
{, , , , , },
{, , , , , },
{, , , , , },
{, , , , , }
}; ///对矩阵 arrMat 进行压缩
ElemType *pCom = Compress( arrMat ); ///从压缩矩阵输出整个矩阵, 使用 0 索引
int m = , n = ;
for( m = ; m < MAT_ROW; ++m )
{
for( n = ; n < MAT_COL; ++n )
{
printf( "%d ", Value(pCom, m, n) );
} putchar( '\n' );
} return ;
}

运行测试:

若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢。                                                                                                                                                                                                                                                                                                                                                       

C语言 对称矩阵 压缩 实现的更多相关文章

  1. C语言 稀疏矩阵 压缩 实现

    稀疏矩阵压缩存储的C语言实现 (GCC编译). /** * @brief C语言 稀疏矩阵 压缩 实现 * @author wid * @date 2013-11-04 * * @note 若代码存在 ...

  2. java数据结构至对称矩阵压缩存储

    刚刚刷java选择题,遇到的对称矩阵压缩存储问题,我们知道对称矩阵是aij=aji的矩阵,压缩存储可以采用一维数组和二维数组存储. 此处只讨论一维数组存储的形式,设数组下标从0开始,对称矩阵为n维矩阵 ...

  3. C语言Huffman压缩和解压

    符号表结构体: struct node { // 字符串形式存储的Huffman编码 char code[MAX_CODE_LENGTH]; // 这个字符在文件中出现的次数 long count; ...

  4. C# .NET 使用第三方类库DotNetZip解压/压缩Zip rar文件

    DotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码……总之感觉比SharpZipLib好用.而且DotNetZip支持VB, ...

  5. 在Spark程序中使用压缩

    当大片连续区域进行数据存储并且存储区域中数据重复性高的状况下,数据适合进行压缩.数组或者对象序列化后的数据块可以考虑压缩.所以序列化后的数据可以压缩,使数据紧缩,减少空间开销. 1. Spark对压缩 ...

  6. C++ 记事本: 从历史说起

    C 的简史 在谈论 C++ 的历史那么必须先得了解 C 的历史,那么我们先来看一段来自于 <<C专家编程>> 对 C 语言史前阶段的简单阐述: Ken Thompson(左), ...

  7. DotNet 资源大全中文版

    https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...

  8. python3光学字符识别模块tesserocr与pytesseract

    OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程,对应图形验证码来说,它们都是一些不规则的字符,这些字符是由 ...

  9. 数据结构与算法(C/C++版)【数组】

    第五章<数组> 一.概念 根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组.二维数组.….n维数组.n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用 ...

随机推荐

  1. 文件读写方法1.FileInputStream和FileOutputStream

    package fileTest; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx ...

  2. Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、

    查询所有表名:select t.table_name from user_tables t;查询所有字段名:select t.column_name from user_col_comments t; ...

  3. [珠玑之椟]浅谈代码正确性:循环不变式、断言、debug

    这个主题和代码的实际写作有关,而且内容和用法相互交织,以下只是对于其内容的一个划分.<编程珠玑>上只用了两个章节20页左右的篇幅介绍,如果希望能获得更多的实例和技巧,我比较推崇<程序 ...

  4. poj 2987 最大权闭合图

    Language: Default Firing Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8744   Accept ...

  5. 未能加载文件或程序集Microsoft.ReportViewer.WebForms, Version=10.0.0.0

    解决方案如下ASP.NET项目使用VS2010开发,部署到windows 2008环境中,出现未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=1 ...

  6. pickle

    [pickle] Python提供了pickle模块来实现序列化. 首先,我们尝试把一个对象序列化并写入文件: pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个by ...

  7. android通过gradle打包

    这里是最简单的打包方法,实际上gradle的语法是groovy,可以通过编写脚本实现更智能的构建,这个我还不懂==,等我学习了解后,单独整理一个gradle的随笔,这里先应付打包吧   环境要求 安装 ...

  8. Python-类的继承

    类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 class 派生类名(基类名):/ ...

  9. MATLAB - 运算符

    1.关系运算符用来比较两个数之间的大小关系,在Matlab中的关系运算符包括: <  小于 <= 小于或等于 >        大于 >=      大于或等于 ==     ...

  10. HttpServletResponse

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...