C语言 对称矩阵 压缩 实现
对称矩阵压缩的简单实现 (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语言 对称矩阵 压缩 实现的更多相关文章
- C语言 稀疏矩阵 压缩 实现
稀疏矩阵压缩存储的C语言实现 (GCC编译). /** * @brief C语言 稀疏矩阵 压缩 实现 * @author wid * @date 2013-11-04 * * @note 若代码存在 ...
- java数据结构至对称矩阵压缩存储
刚刚刷java选择题,遇到的对称矩阵压缩存储问题,我们知道对称矩阵是aij=aji的矩阵,压缩存储可以采用一维数组和二维数组存储. 此处只讨论一维数组存储的形式,设数组下标从0开始,对称矩阵为n维矩阵 ...
- C语言Huffman压缩和解压
符号表结构体: struct node { // 字符串形式存储的Huffman编码 char code[MAX_CODE_LENGTH]; // 这个字符在文件中出现的次数 long count; ...
- C# .NET 使用第三方类库DotNetZip解压/压缩Zip rar文件
DotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码……总之感觉比SharpZipLib好用.而且DotNetZip支持VB, ...
- 在Spark程序中使用压缩
当大片连续区域进行数据存储并且存储区域中数据重复性高的状况下,数据适合进行压缩.数组或者对象序列化后的数据块可以考虑压缩.所以序列化后的数据可以压缩,使数据紧缩,减少空间开销. 1. Spark对压缩 ...
- C++ 记事本: 从历史说起
C 的简史 在谈论 C++ 的历史那么必须先得了解 C 的历史,那么我们先来看一段来自于 <<C专家编程>> 对 C 语言史前阶段的简单阐述: Ken Thompson(左), ...
- DotNet 资源大全中文版
https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...
- python3光学字符识别模块tesserocr与pytesseract
OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程,对应图形验证码来说,它们都是一些不规则的字符,这些字符是由 ...
- 数据结构与算法(C/C++版)【数组】
第五章<数组> 一.概念 根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组.二维数组.….n维数组.n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用 ...
随机推荐
- VMware学习笔记(一)
vmware核心产品是vSphere,而vSphere主要包括ESXi和vCenterServer. ESXi不依赖其它操作系统OS,安装在每一台物理机上,ESXi是免费的.在ESXi主机上再安装vS ...
- avalon2学习教程15指令总结
avalon的指令在上一节已经全部介绍完毕,当然有的语焉不详,如ms-js.本节主要总结我对这方面的思考与探索. MVVM的成功很大一语分是来自于其指令,或叫绑定.让操作视图的功能交由形形式式的指令来 ...
- Oracle优化查询技巧
1. WHERE子句中的连接顺序:Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的 ...
- Icinga快速安装与配置
Icinga快速安装与配置/* body */body { margin: 20px; padding: 0; font-family: "Lucida Grande", &quo ...
- 转载:mysql ODBC 在64位下提示找不到odbc驱动问题
在64位机器上,如果你想要连接32位mysql ,一般会安装mysql connector/ODBC 64位,并在配置ODBC数据源测试中连接正常,但在程序连接,如ASP.asp.net.VB.Del ...
- wamp密码设置
WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...
- linux运维笔记——常用命令详解diff
1.diff 你可以把diff看成是linux上的文件比对工具 例子文件内容: [root@localhost disks]# cat test1.txt a b c d [root@localhos ...
- 修改navigationbar右侧按钮离屏幕边缘位置
先上代码 UIButton *settingBtn = [Utils creatCustomButtonWithFrame:CGRectMake(, , , ) btnTitle: titleColo ...
- android中的MVP模式
1.建立bean public class UserBean { private String mFirstName; private String mLastName; public UserBea ...
- MySQL表分区
MySQL的表分区 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以 ...