4.2 矩阵的压缩存储(一)

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

4.2.1 特殊矩阵

所谓特殊矩阵,指的是相同值的元素或者零元素在矩阵中的分布有一定规律的矩阵。

1.对称矩阵

若n阶方阵A中的元素满足下述性质:
aij=aji(0≤i,j≤n−1)a_{ij}=a_{ji} (0≤i,j≤n-1) aij​=aji​(0≤i,j≤n−1)
则称A为n阶的对称矩阵。对称矩阵中的元素是关于主对角线对称的,所以只需要存储矩阵上三角或者下三角的元素即可。让两个对称的元素共享一个存储空间。这样,就能够节省近一半的存储空间。

原来数据结构这么厉害,怪不得必须得学。。。

[a00a10a11a20a21a22.........an−10an−11...an−1n−1]\begin{bmatrix} a_{00}&&&&\\ a_{10}&a_{11}\\ a_{20}&a_{21}&a_{22}\\ ...&...&...&\\ a_{n-10}&a_{n-11}&...&a_{n-1n-1}\\ \end{bmatrix} ⎣⎢⎢⎢⎢⎡​a00​a10​a20​...an−10​​a11​a21​...an−11​​a22​......​an−1n−1​​⎦⎥⎥⎥⎥⎤​

​ 对称矩阵下三角元素示意图

在以上的下三角矩阵中,第i行(0≤i≤m-1)恰好有i+1个元素,所以元素总数为
∑i=0n−1(i+1)=n(n+1)/2\sum_{i=0}^{n-1}(i+1)=n(n+1)/2 i=0∑n−1​(i+1)=n(n+1)/2

刚看到n(n+1)/2这个公式的时候有点熟,好像在哪里见过。百度了下,就是当年1+2+3+…+100=?这个题所使用的公式吗!!100个100+1然后再除以2。。。

这样看就明白了,原谅我还是没把这思维带入到里面。。。

假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,那么,矩阵中元素
aija_{ij} aij​
和数组元素sa[k]之间存在着一 一对应关系。

这个下标ij不好表示到一行中,如果有比较好的工具麻烦跟我说下。

这种对应关系分析如下:

  1. 若i≥j时,则a _ {ij}在下三角矩阵中。

    a _{ij}之前i行(从0行到第i-1行)一共有1+2+3+...+i=i * (i+1) /2个元素,在第i行上,a _{ij}之前恰好有j个元素。

k=i∗(i+1)/2+j(0≤k<n(n+1)/2)k=i * (i + 1) / 2 + j \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ( 0≤ k <n (n+1) / 2 ) k=i∗(i+1)/2+j                (0≤k<n(n+1)/2)

  1. 若i<j时,则a_{ij}在上三角矩阵中。

    因为有
    aij=ajia_{ij}=a_{ji} aij​=aji​
    所以只要交换i和j即可得到:
    k=j∗(j+1)/2+i(0≤k<n(n+1)/2)k=j * (j + 1) / 2 + i \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ( 0≤ k <n (n+1) / 2 ) k=j∗(j+1)/2+i                (0≤k<n(n+1)/2)

因此,有:
k={j∗(j+1)2+ii<j,i∗(i+1)2+ji≥j,0≤k<n(n+1)/2k=\begin{cases} \end{cases}^{i*(i+1)2+j\ \ \ \ \ \ i≥j,}_{j*(j+1)2+i\ \ \ \ \ \ i<j,}0≤k<n (n+1) / 2 k={j∗(j+1)2+i      i<j,i∗(i+1)2+j      i≥j,​0≤k<n(n+1)/2

由此,a_{ij}的存储地址可用下面的公式计算:

LOC(aij)=LOC(sa[k])=LOC(sa[0])+k∗dLOC(a_{ij})=LOC(sa[k])=LOC(sa[0])+k*d LOC(aij​)=LOC(sa[k])=LOC(sa[0])+k∗d

LOC代表的含义是存储地址,sa[0]是第一个元素,k代表元素个数,d代表一个元素需要d个存储单元

有了上述的计算公式,就能够立即找到矩阵元素a_{ij}在其压缩存储表示sa中的对应位置k。例如,
a32和a23a_{32}和a_{23} a32​和a23​
都存储在sa[8]中,这是因为
k=i∗(i+1)/2+j=3∗(3+1)/2+2=8k=i*(i+1)/2+j=3*(3+1)/2+2=8 k=i∗(i+1)/2+j=3∗(3+1)/2+2=8

例4.3

已知A和B是两个n * n阶的对称矩阵,因为是对称矩阵,所以仅需要输入下三角元素值存入一维数组。试写一算法,求对称矩阵A和B的乘积。

  • 分析:

    如果是两个完整的矩阵相乘,其算法是比较简单的,但由于是对称矩阵,所以要清楚对称矩阵的第i行和第j列的元素数据在一维数组中的位置,其位置计算公式为:
    l=i∗(i+1)/2+j当i≥j时(Aij,Bij处于下三角中);l=i*(i+1)/2 +j \ \ \ \ \ \ 当i≥j时(A_{ij},B_{ij}处于下三角中); l=i∗(i+1)/2+j      当i≥j时(Aij​,Bij​处于下三角中);

    l=j∗(j+1)/2+i当i<j时(Aij,Bij处于上三角中);l=j*(j+1)/2 +i \ \ \ \ \ \ 当i<j时(A_{ij},B_{ij}处于上三角中); l=j∗(j+1)/2+i      当i<j时(Aij​,Bij​处于上三角中);

    期中,l代表A_{ij}B_{ij}在其对称矩阵中的位置,而且0≤l<n(n+1)/2。因此,实现本题功能的算法如下:

    void matrixmult(int a[] ,int b[] ,int c[][20],int n){//n为A、B矩阵下三角元素个数,a,b分别为一维数组,存放矩阵A和B的下三角元素值//c存放A和B的乘积for(i=0;i<20;i++){for(j=0;j<20;j++){s=0;for(k=0;k<n;k++){if(i>=k){      //表示元素为下三角的元素,计算在a数组中的下标l1=i*(i+1)/2+k;}else {            //表示元素为上三角的元素,计算下标l1=k*(k+1)/2+i;}if(k>=j){       //表示元素为下三角的元素,计算在b数组中的下标l2=k*(k+1)/2+j;}else {l2=j*(j+1)/2+k;}s=s+a[l1]*b[l2];}c[i,j]=s;}}
    }
    

这例子是啥呀,看都看不懂。心态炸裂。无能狂怒。n代表一个矩阵下三角元素个数?假设20的对阶,个数是20 * (20 +1)/2=210 一半的话也有100多,这循环?????

不敢否认这书的正确性,毕竟是自考指定教材。敢不敢再写详细点。。。。。

算了,略过这个。考试要是考了当我送给你的。

好气啊 。 。。 。。。。。 。。。。。。。。 。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

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

  1. 数据结构笔记(十七)--矩阵的压缩存储

    矩阵的压缩存储 一.矩阵的分类 1.特殊矩阵:其矩阵值在在矩阵中分布有规律 2.稀疏矩阵:矩阵的非零值在矩阵中占比小于0.05的矩阵,即零值占比在95%以上 3.一般矩阵:不属于上面的两种矩阵 二.矩 ...

  2. 数据结构C语言实现-矩阵的压缩存储

    一.矩阵的压缩存储: 在编写程序时往往都是二维数组表示矩阵,然而在数值分析中经常出现一些阶数很高的的矩阵同时在距震中有很多值相同的元素,或者是零元素,为了节省空间,可以对这类矩阵进行压缩存储,所谓的压 ...

  3. 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)

    在矩阵中有许多值相同的元素或者是零元素.有时为了节省存储空间,可以对这类矩阵进行压缩存储.所谓的压缩存储是指:为多个值相同的元值分配一个存储空间:对零元不分配空间. 5.32稀疏矩阵 在m*n的矩阵中 ...

  4. 矩阵的压缩存储(随机稀疏矩阵的建立和输出)

    实际应用中会有很多利用高阶矩阵的问题,有的高阶矩阵已达到几十万阶,几千亿个元素.然而,多数的高阶矩阵中包含了大量的数值为零的元素,需要对这类矩阵进行压缩存储.因为合理的压缩存储不仅能有效地节省存储空间 ...

  5. 9.特殊矩阵的压缩存储

    压缩存储:指多个值相同的元素只分配一个存储空间, 对零元素不分配存储空间. 特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的 分布有一定规律性的矩阵. 特殊矩阵的压缩存储:找出 ...

  6. 34-对称矩阵的压缩存储

    对于矩阵这样由n行n列构成的数据集合,可以通过二维数组来进行存储. 在实际工程中也会用到一些特殊的矩阵, 特殊矩阵可以"压缩"的一种思维来降低空间需求. (1)对角矩阵 (2)对称 ...

  7. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  8. 特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

    前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´). 这篇文章首先会介 ...

  9. 3~4矩阵的压缩存储(下)【详解】

    目录 一.特殊矩阵的压缩存储 1.数组的定义 1.1概述 1.2数组与线性表的关系 1.3特点 2.数组的存储结构 2.1一个数组 2.2多维数组 二.矩阵的压缩存储 1.概述 1.1压缩存储 1.2 ...

最新文章

  1. tftp怎么给服务器传文件,TFTP文件传输工具使用
  2. python 1033 旧键盘打字 (20 分)
  3. Python:常用模块简介(1)
  4. .NET Standard@Xamarin.Forms
  5. 一个基于POP3协议进行邮箱账号验证的类
  6. linux杀掉80端口线程命令
  7. 快捷方式修复_Mac上的屏幕截图不起作用该如何修复?
  8. scrapy框架的日志等级和请求传参
  9. SMT32H743+CubeMX-配置MPU后,在Keil上的程序卡死
  10. 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
  11. cuDNN编写卷积实例
  12. L2-016 愿天下有情人都是失散多年的兄妹(DFS)
  13. Atitit 项目通讯接口方案attilax总结.docx
  14. python 中英文对齐_解决Python 中英文混输格式对齐的问题
  15. 不同层级管理者应具备的特质
  16. python 基于百度aip库 实现识别图片中的文字
  17. [个人笔记] ssh-keygen和openssl工具的使用
  18. 模拟私网问题导致节点宕机无法启动
  19. 好用的python打包软件_Python打包exe文件方法汇总【4种】
  20. 题解:《不高兴的津津》(原版、升级版)

热门文章

  1. 韦根Wiegand协议
  2. 传输层协议 —— UDP
  3. css属性之padding和margin
  4. Linux c使用gumbo库解析页面表单信息(二)
  5. LINUX线程及线程间通信
  6. 基于FPGA的数据采集系统
  7. 中创向心力:践行《国家职业教育改革实施方案》,积极推进职业教育改革
  8. IEEE之后,学术政治化会成为人类的“潘多拉魔盒”吗?
  9. 使用log4j将日志输送到控制台、文件或数据库中
  10. Vue项目中城市下拉选择 城市js文件