特殊矩阵的压缩存储(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)

news/2025/2/14 7:16:30/

目录

  • 1.数组的存储结构
    • 1.—维数组
    • 2.二维数组
      • 1.行优先存储
      • 2.列优先存储
  • 2.特殊矩阵
    • 1.对称矩阵
      • 1.行优先存储
    • 2.三角矩阵
      • 1.上三角矩阵
      • 2.下三角矩阵
    • 3.三对角矩阵(带状矩阵)
    • 4.稀疏矩阵

1.数组的存储结构

1.—维数组

各数组元素大小相同,且物理上连续存放。
数组元素a[i]的存放地址= 起始地址 L O C + i ∗ s i z e o f ( E l e m T y p e ) ( 0 < i < 10 ) 起始地址LOC+i * sizeof(ElemType)(0<i<10) 起始地址LOC+isizeof(ElemType)(0<i<10)

2.二维数组

1.行优先存储

M行N列的二维数组b[M][N]中,若按行优先存储
则b[i][j]的存储地址= L O C + ( i ∗ N + j ) ∗ s i z e o f ( E l e m T y p e ) LOC + (i*N+ j) * sizeof(ElemType) LOC+(iN+j)sizeof(ElemType)

2.列优先存储

M行N列的二维数组b[M][N]中,若按列优先存储
则b[i][i]的存储地址= L O C + ( j ∗ M + i ) ∗ s i z e o f ( E l e m T y p e ) LOC+ ( j*M+i ) * sizeof(ElemType) LOC+(jM+i)sizeof(ElemType)

2.特殊矩阵

1.对称矩阵

若n阶方阵中任意一个元素aij,都有 a i j = a j i aij=aji aij=aji则该矩阵为对称矩阵
压缩存储策略:只存储主对角线+下三角区(或主对角线+上三角区)

1.行优先存储

1.下三角区
策略:只存储主对角线+下三角区
①存储的数组长度: ( 1 + n ) ∗ n / 2 (1+n)*n/2 (1+n)n/2
②矩阵下标 a i j aij aij与一维数组下标k的映射关系: k = i ( i − 1 ) 2 + j − 1 , i > = j k=\frac{i(i-1)}{2}+j-1,i>=j k=2i(i1)+j1,i>=j

2.上三角区
根据对称矩阵的性质: a i j = a j i aij = aji aij=aji
k = j ( j − 1 ) 2 + i − 1 , i < j k=\frac{j(j-1)}{2}+i-1,i<j k=2j(j1)+i1,i<j

2.三角矩阵

压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c

1.上三角矩阵

除了主对角线和上三角区,其余的元素都相同。
按照行优先的原则,映射关系: k = ( i − 1 ) ( 2 n − i + 2 ) 2 + j − i , i < = j ( 上三角区和主对角线元素 ) k=\frac{(i-1)(2n-i+2)}{2}+j-i,i<=j(上三角区和主对角线元素) k=2(i1)(2ni+2)+jii<=j(上三角区和主对角线元素)
k = n ( n + 1 ) 2 , i > j ( 下三角区元素 ) k = \frac{n(n+1)}{2},i>j(下三角区元素) k=2n(n+1)i>j(下三角区元素)
在这里插入图片描述

2.下三角矩阵

除了主对角线和下三角区,其余的元素都相同。
按照行优先的原则,映射关系: k = i ( i − 1 ) 2 + j − 1 , i > = j ( 下三角区和主对角线元素 ) k=\frac{i(i-1)}{2}+j-1,i>=j(下三角区和主对角线元素) k=2i(i1)+j1i>=j(下三角区和主对角线元素)
k = n ( n + 1 ) 2 , i < j ( 上三角区元素 ) k = \frac{n(n+1)}{2},i<j(上三角区元素) k=2n(n+1)i<j(上三角区元素)

在这里插入图片描述

3.三对角矩阵(带状矩阵)

三对角矩阵,又称带状矩阵 当 ∣ i − j ∣ > 1 时,有 a i j = 0 ( 1 < = i , j ≤ n ) 当|i -j|>1时,有aij=0 (1<=i, j ≤n) ij>1时,有aij=0(1<=i,jn)
压缩存储策略:按行优先((或列优先)原则,只存储带状部分。
①已知aij求数组下标k:
前i-1行共 3 ( i − 1 ) − 1 3(i-1)-1 3(i1)1个元素
aij是i行第 j − i + 2 j-i+2 ji+2个元素
aij是第 2 i + j − 2 2i+j-2 2i+j2个元素
k = 2 i + j − 3 k=2i+j-3 k=2i+j3(数组下标从0开始)
②若已知数组下标k,如何得到i,j?
即第k+1个元素:
i = 「 ( k + 2 ) / 3 ] i =「(k+2)/3] i=(k+2)/3](向上取整)
k = 2 i + j − 3 k=2i+j-3 k=2i+j3得,
j = k − 2 i + 3 j=k-2i+3 j=k2i+3

在这里插入图片描述

4.稀疏矩阵

稀疏矩阵:非零元素远远少于矩阵元素的个数。
压缩存储策略:
①顺序存储:三元组<行,列,值>,会失去随机存储的特性。
例如:
在这里插入图片描述
对应的三元组为:
在这里插入图片描述

②链式存储:十字链表法
结点说明:
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1207602.html

相关文章

LINUX入门篇【4】开发篇--开发工具vim的使用

前言&#xff1a; 从这一篇开始&#xff0c;我们将正式进入使用LINUX进行写程序和开发的阶段&#xff0c;可以说&#xff0c;由此开始&#xff0c;我们才开始真正去使用LINUX。 介绍工具&#xff1a; 1.LINUX软件包管理器yum&#xff1a; 1.yum的介绍&#xff1a; 在LINUX…

【Leetcode】各结构的时间复杂度

时间复杂度其实就是算法执行完的步骤次数。 二分时间复杂度 log(n) 二分法时间复杂度为什么是logN解析。 二分法就是把一个数据规模为N的先分为N/2&#xff0c;然后再分为N/4,N/8,N/16…一直等分到N/y 1的时候就不分了&#xff0c;现在我们来考虑下&#xff0c;到底分多少次才…

【Rust日报】2023-11-08 RustyVault -- 基于 rust 的现代秘密管理系统

RustyVault -- 基于 rust 的现代秘密管理系统 RustyVault 是一个用 Rust 编写的现代秘密管理系统。RustyVault 提供多种功能&#xff0c;支持多种场景&#xff0c;包括安全存储、云身份管理、秘密管理、Kubernetes 集成、PKI 基础设施、密码计算、传统密钥管理等。RustyVault 可…

leetcode一道比较难的链表题

今天还是继续来分享我们的链表题&#xff0c;这个题目有点难&#xff0c;主要是思路比较难想&#xff0c;但是如果沥青思路写起来就比较简单了&#xff08;我乱讲的&#xff09; 随机链表的复制 这个是题目的描述&#xff0c;大家也可以在链接里看&#xff0c;那我把这道题目…

C语言中一维指针、二维指针和三维指针

指针可以指向一份普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一份指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

Triples of Cows

题目传送门 引 模拟赛 T 4 T4 T4 , 变换挺妙的, 而且感觉转换后问题就迎刃而解了 解法 强行模拟拆点重连边显然不行,会让图的边数达到 n 2 n^2 n2 级别的 —————————————————————————————————————————————————— 考虑转…

晶振分频【FPGA】

所有数据对齐晶振。 6分频&#xff1a;【1】 module divider_six // 6分频 【0~2】 ( input wire sys_clk , //系统时钟 50MHz input wire sys_rst_n , //全局复位 output reg clk_out //对系统时钟 6 分频后的信号 );reg [1:0] cnt; //用于计数的寄存器 //cnt:计数器从 0 到…

【STM32】STM32的Cube和HAL生态

1.单片机软件开发的时代变化 1.单片机的演进过程 (1)第1代&#xff1a;4004、8008、Zilog那个年代&#xff08;大约1980年代之前&#xff09; (2)第2代&#xff1a;51、PIC8/16、AVR那个年代&#xff08;大约2005年前&#xff09; (3)第3代&#xff1a;51、PIC32、Cortex-M0、…