矩阵我个人理解就是一堆数据放在一块儿排列整齐,当然正规一点说就是m行n列的数据构成。在编程中一般采用数组对其进行存储,但矩阵中的某些特殊矩阵里,有时会出现很多数据相等或者存有很多0只有某几个位置为别的数据,那么这类矩阵我们在用数组存储的时候就会感觉比较的浪费空间,那么会对一些特殊矩阵进行压缩存储。

常见的能够压缩存储的矩阵有对称矩阵和稀疏矩阵,今天主要说说对称矩阵的压缩存储。先来说说什么是对称矩阵,相信大家都很熟悉,对于一个矩阵如果它的行和列相等并且矩阵中的数据是关于对角线对称的,那么我们称这样的矩阵为对称矩阵,拿公式来说就是:A[i][j] = A[j][i](0<=i<=N-1&&0<=j<=N-1)。

那么对于这样的对称矩阵我就只需要存储它的一个上三角或者下三角就足够,没必要对另一部分重复的数据存储。

一维数组开辟多大:

观察上面的对称矩阵,如果我要存储下三角,那么在类中给一位数组开辟的大小是多少呢?可以看到下三角第一行为一个元素,往下依次递增,直到最后一行N个元素,可以发现就是等差数列求和的问题,那么来计算:(1+5)*5/2=15,因此用来存储矩阵的一位数组开辟上15个空间的大小,这样相对于之前能够节省接近一半的存储空间。

对称矩阵和压缩存储的对应关系:

因为是存储下三角,所以是把矩阵中元素A[i][j](i>=j)存放到数组Array中。那么在这里看一下两者的对应关系。

上图给出了矩阵中部分元素在一位数组中的存储位置也就是索引,那么怎么确定其在数组中的索引呢,其实这仅仅是一个数学问题也比较简单,我们来看看在Array[13]位置存储的那个元素2,它在矩阵中的位置为A[4][3],那么我们放眼到上图中的那个下三角,这个2的上面正好有4行,那么上面的元素的个数又是一个等差求和(1+4)*4/2=10,在加上它的列数3结果就是13.所以可以列出公式为:SymmetricMatrix[i][j] == Array[i*(i+1)/2+j],SymmetricMatrix代表我们的对称矩阵。

看代码说话:

构造这样的一个对称矩阵类时,需要两个成员变量,一个是用来存放矩阵的一位数组_arr,一个是一位数组的大小_size.下面是构造函数:

SymmetricMatrix(T *arr, int N)

:_size(N*(N + 1) / 2)

{

assert(arr);

arr = new T[_size];

int idex = 0;

for (int i = 0; i < N; ++i)

{

for (int j = 0; j < N; ++j)

{

if (i >= j && idex<_size>

{

_arr[idex++] = arr[i*N + j];

}

}

}

}

其实整体代码还是比较简单的,在类中还要重载它的输出操作符,思路就是根据矩阵的i和j计算出一位数组中的索引然后输出就可以了,当然下三角的是i>=j的,所以如果循环中如果i

以下为整体代码:

template

class SymmetricMatrix

{

public:

SymmetricMatrix(T *arr, int N)

:_size(N*(N + 1) / 2)

{

assert(arr);

arr = new T[_size];

int idex = 0;

for (int i = 0; i < N; ++i)

{

for (int j = 0; j < N; ++j)

{

if (i >= j && idex<_size>

{

_arr[idex++] = arr[i*N + j];

}

}

}

}

T Access(size_t _row,size_t _col)const

{

if (_row < _col)

{

swap(_row, _col);

}

return _arr[_row*(_row + 1) + _col];

}

template

friend ostream& operator< sm)

{

size_t N = sqrt((long double)sm._size * 2);

for (size_t i = 0; i < N; ++i)

{

for (size_t j = 0; j < N; ++j)

{

_cout << sm.Access(i, j) << " ";

}

_cout << endl;

}

return _cout;

}

private:

T *_arr;

int _size;

};

文章作者:Mr_listening,博客地址:http://www.cnblogs.com/MrListening/

c语言对称矩阵的压缩存储_对称矩阵的压缩存储和输出相关推荐

  1. centos7连接华为san存储_云计算中的存储技术 | SPOTO 分享

    概述:在云计算的领域离不开存储,那么云计算使用的存储包括三种类型:虚拟化的存储(虚拟化存储.非虚拟化存储.裸设备映射,一般用于虚拟化场景)和分布式存储(存储池和存储卷,一般用于私有云场景和虚拟化场景) ...

  2. python多维数据存储_在Python中存储和重新加载大型多维数据集

    我将运行大量的模拟,产生大量的数据,这些数据需要在以后存储和访问.我的模拟程序的输出数据被写入文本文件(每个模拟一个).我计划编写一个Python程序来读取这些文本文件,然后以更便于以后分析的格式存储 ...

  3. 创建存储,修改存储_安全地创建和存储密码

    创建存储,修改存储 几乎每次涉及用户配置文件时,都必须管理用户凭据,从而能够创建和存储用户密码. 通常应该使用哈希密码和盐分密码来准备数据库公开和通过使用Rainbow表进行哈希逆转. 但是,找到以明 ...

  4. vmware挂载san存储_细述企业级存储NAS和SAN差异

    常见服务器磁盘类型 SAS:容量小,300G,600G,价格贵 SATA:容量大,4T,不支持热插拔,价格低 假SAS:容量大,支持热插拔,价格低,(就是SAS接口的SATA盘)(缺点:故障率比SAS ...

  5. 微信小程序本地存储存储_如何利用本地存储构建快速的应用程序

    微信小程序本地存储存储 by Nikita Kozlov 由Nikita Kozlov 如何利用本地存储构建快速的应用程序 (How to leverage Local Storage to buil ...

  6. pythonshell压缩文件_文件夹压缩成zip格式

    前言: 在最近的后台开发工作中,需要将服务器的指定文件夹压缩,然后传输到前台.shell的zip命令可以很方便的实现该需求,python也有对应的模块,这里简要记录一下使用两种方式压缩文件的方法. s ...

  7. javascript存储_如何使用JavaScript存储Adobe AIR应用程序首选项

    javascript存储 In my previous article I was quite excited about starting my first AIR application, cal ...

  8. icloud文档本地存储_如何在iCloud存储上省钱

    icloud文档本地存储 The situation with iCloud storage would be funny if it wasn't so ridiculous, and we've ...

  9. ossfs挂载百度对象存储_阿里云对象存储OSS挂载工具

    前言 宝塔面板里有类似服务9.9一个月,愿意花钱的大佬们也不会搜到我这篇文章 不想花钱的小伙伴们就仔细看看下面我这篇文章吧 科普:linux常用命令: ls 查看当前目录下文件 安装及配置 下载:安装 ...

  10. 数据结构的学习_4.2 矩阵的压缩存储(对称矩阵)

    4.2 矩阵的压缩存储(一) 在有些情况下,矩阵中含有许多值相同或者值为零的元素,如果还按前面的方法来存储这种矩阵,就会产生大量的空间浪费.为了节省存储空间,可以对这类矩阵采用压缩存储. 4.2.1 ...

最新文章

  1. hook情况下,解决内联没有:hover的方案
  2. 再有人问你Netty是什么,就把这篇文章发给他
  3. 人脸识别,现在连动漫角色都不放过
  4. OpenCV4.5.x DNN + YOLOv5 C++推理
  5. 为什么要用MyBatis-MyBatis
  6. OSChina 周日乱弹 —— 我叫张一条
  7. java适配器模式应用_java笔记--适配器模式的运用
  8. 判断来访者所用设备是iPhone、iPad或者电脑(PC)
  9. matlab中a k,Python:相当于Matlab的大型数组的svds(A,k)?
  10. 软件工程实践专题第三次团队作业
  11. 在html文档中添加 iconfont 图标
  12. 数学主题分类 - 中文(上)
  13. BTC投资者损失预计达73亿美元 “割肉式”抛售来袭?加密寒冬比预期更冷、更长
  14. android第三方登录appid,Android 第三方登录之支付宝登录
  15. eXo Platform 3.0访谈
  16. 经典算法之左边界二分查找法(俗称左边界二分搜索法)
  17. 台式电脑打不开计算机c盘,电脑打不开显示C盘损坏怎么办
  18. 软件开发常用工具和网站
  19. 进销存管理怎么做?推荐一款免费进销存管理系统!
  20. Web开发 Cs和Bs架构

热门文章

  1. java计算机毕业设计影院资源管理系统演示录像2020源程序+mysql+系统+lw文档+远程调试
  2. 泛微E-Office v9任意文件上传(CNVD-2021-49104)复现
  3. GPRS通信原理+中国移动micro sim 卡,实现经过tcp/ip 传输数据到服务器
  4. 修改树莓派上Transmission设置提高同时下载任务数量
  5. 我的Python网路爬虫学习之路--1
  6. php解析krc文件,将酷狗krc歌词解析并转换为lrc歌词php源码_PHP
  7. 彻底删除的文件也能找回
  8. 抱米花豆丁下载器20100529(单文件绿色版)
  9. 分享一个修改电脑IP的小工具
  10. 读书笔记《松本行弘的程序世界》