当前位置: 首页 > news >正文

矩阵压缩存储

矩阵压缩存储

  • 特殊矩阵和稀疏矩阵

  1. 特殊矩阵:矩阵中很多值相同的元素并且分布具有一定规律。

  2. 稀疏矩阵:矩阵中有很多零元素。

  3. 压缩矩阵的基本思想

    (1)为多个值相同的元素只分配一个存储空间;

    (2)对零元素不分配存储空间。

一.特殊矩阵的压缩存储

  1. 对称矩阵

    通过正对角线分为两个对称区域的矩阵。

image-20250303212410003

对于这种对称矩阵的压缩存储,我们的主要方法就是将二维下三角矩阵转化为一维数组,所以我们要确定某一元素在一位数组中的位置。

image-20250303212430842

通过公式计算出来的k值便是所找元素在一维数组中所处的位置。

image-20250225213323840

对于下三角中的元素aij(i>=j),在数组中下标ki、j的关系为:k=i*(i-1)/2+j-1

对于上三角中的元素aij(i<=j),因为aij=aji,则访问和他对应的元素aij即可,即:k=j*(j-1)/2+i-1

通过这个方法,我们就可以将对称的矩阵进行压缩,能节省将近一半的存储空间。

  1. 三角矩阵

    上三角或下三角区域为某一常数的矩阵。

    image-20250303212449505

对于这种三角矩阵的存储,和对称矩阵的存储类似,只需要存储下三角所有元素和某一个元素。

image-20250303212502116

下三角矩阵中某一元素**aij**在数组中的下标k与i、j的对应关系:

​ 当i>=j:k=i*(i-1)/2+j-i 当i<=j:n*(n+1)/2

  1. 三对角矩阵

    所有非零元素都集中在以主对角线为中心的带状区域中,除了主对角线和它的上下方若干条对角线的元素外,所有其他元素都为零。

    image-20250225220930980

    对于三对角矩阵,除了对角线有值的元素需要存储,剩下的0可以省略

    image-20250303195303626

    首先我们要认识到,矩阵下标是从1开始的,而数组下标是从0开始的.该矩阵中,除第一行只有两个元素外,其余的i-2行都有三个元素,所以前i-1行非0元素的个数为:3(i-1)-1;第i行的三个元素下标可以通过j-i确定,可以得出第i行中非0元素的个数为j-i+1

    所以:k=3(i-1)-1+j-i+1 = 2i+j-3

    1. 稀疏矩阵

    矩阵中非零元素的个数过低(有的说是低于5%,有的说是低于30%)称为稀疏矩阵。

    image-20250303212816838

4.3.1 三元组

​ 将稀疏矩阵的非零元素对应的三元组所构成的集合,按行优先的顺序排列成一个线性表。

​ 将上图排列为一个三元组表:((1,1,15),(2,2,11),(3,4,6),(5,1,9)).即:(i,j,aij).

image-20250303212545937

row为行,col为列,item为该行该列的元素值.

const int MAX = 100;

struct Triple {
    int row, col; //行号,列号
    int item; //非零元素值.
};

struct sparseMatrix {
    struct Triple data[MAX]; //存储非零元素
    int mu, nu, num; //行数,列数,非零元素个数
};
4.2 十字链表

​ 通过链表,将矩阵的每一行用一个带头结点的链表表示,每一列也用一个带头结点的链表表示.每个元素结点有五个量,分别为: 行数,列数,值,指向下方结点的指针,指向右方结点的指针.

image-20250303212600384

image-20250303212611224

typedef struct Node {
    int i,j;//非零元素的行标和列表
    int data;
    struct Node* right;
    struct Node* down;//指向右方和下方结点的指针
}Node;
typedef struct hNode {
    struct hNode *rhead;
    struct hNode *chode;//指向两头结点数组的指针
    int r,c,k;//矩阵的行数,列数,及非零元素的个数
}hNOde;

图源来自: 懒猫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/48954.html

相关文章:

  • 大白话TypeScript 第十章TypeScript 学习全阶段详细总结
  • Unity TMP_InputField 多行输入时的高度适应
  • Spring生命周期都有哪些阶段
  • k8s命名空间和资源配额
  • redis 与 DB 的一致性 7 种策略
  • 软考教材重点内容 信息安全工程师 第18章 网络安全测评技术与标准
  • 【C语言】高内聚低耦合:结构体、联合体、数组、字符串、枚举和指针的综合实践
  • 显式 GC 的使用:留与去,如何选择?
  • [RN]React Native知识框架图详解
  • GPU架构分类
  • win11远程桌面连接报错(出现身份验证错误。要求的函数不受支持。可能是CredSSP 加密数据库修正)的解决办法整理
  • 左值引用与指针的区别
  • rpc学习
  • 网络安全系统分为几级_网络安全系统的分级与软考要点解析
  • 解决样式隔离的方法
  • Live2d官方项目运行
  • c++头文件和命名空间
  • 在线量化算法(QAT) --学习记录1
  • Android 常见View的防抖
  • NO.19十六届蓝桥杯模拟赛第三期上
  • 【Wireshark 02】抓包过滤方法
  • Orfeo Toolbox (OTB):开源的遥感数据处理工具箱/QGIS插件
  • DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
  • c++ 迭代器分类及详细讲解
  • 【测试开发面试题】每日 3 题(三)
  • Trae:国内首款AI原生IDE,编程效率大提升
  • doris:Paimon Catalog
  • 智能差旅管理新范式:MyAgent如何重塑企业差旅全流程自动化
  • 【uniapp】离线打包uniapp为apk详细步骤
  • 腾讯三面:写文件时进程宕机,数据会丢失吗?