首页 > 其他分享 >一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储

时间:2023-02-05 21:00:23浏览次数:35  
标签:存储 一维 元素 矩阵 数组 2.2 对角


文章目录

  • ​​1 数组​​
  • ​​1.1 一维数组​​
  • ​​1.2 二维数组​​
  • ​​2 矩阵​​
  • ​​2.1 普通矩阵​​
  • ​​2.2 特殊矩阵​​
  • ​​2.2.1 对称矩阵​​
  • ​​2.2.1.1 策略1​​
  • ​​2.2.1.2 策略2​​
  • ​​2.2.2 三角矩阵​​
  • ​​2.2.2.1 上三角矩阵​​
  • ​​2.2.2.2 下三角矩阵​​
  • ​​2.2.3 三对角矩阵​​
  • ​​2.2.4 稀疏矩阵​​

1 数组

1.1 一维数组

ElemType a[10]; //C语言中的一维数组,数据类型是ElemType

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_数组


数组中的每个元素大小都相同,且存储时是连续存放的。数组元素a[i]的存放地址=Loc+i*sizeof(ElemType),其中0≤i<10。


1.2 二维数组

ElemType b[2][4]; //C语言中2行4列的二维数组,数据类型是ElemType

上面数组的逻辑视角为:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_数组_02


二维数组有两种存储方式,分别是行优先存储和列优先存储,如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三对角矩阵_03


对于M行N列的二维数组​​b[M][N]​​,设二维数组b的初始地址为Loc,则:

(1)若按行优先存储,则​​b[i][j]​​的存储地址=Loc+(i*N+j)*sizeof(ElemType)。

(2)若按列优先存储,则​​b[i][j]​​的存储地址=Loc+(j*M+i)*sizeof(ElemType)。


2 矩阵

2.1 普通矩阵

下图为一个抽象的m×n阶矩阵:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_稀疏矩阵_04


可按【2.2 二维数组】一节中的二维数组存储——行优先存储和列优先存储。需要注意的是:描述矩阵元素时,行、列号通常从1开始;而描述数组时通常下标从0开始。


2.2 特殊矩阵

注意,本节及以下部分讨论的都是方阵

2.2.1 对称矩阵

若n阶方阵中任意一个元素aij都有aij=aji,则该矩阵为对称矩阵。按普通的存储方式即二维数组存储就浪费存储空间了。

对称矩阵的压缩存储策略:只存储主对角线和下三角区或者主对角线和上三角区。

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三对角矩阵_05


上图中上三角区为①,i<j;主对角线为②,i=j;下三角区为③,i>j。

2.2.1.1 策略1

存储策略:只存储主对角线+下三角区的元素,并且按行优先原则将各元素存入一维数组中,因此需要存储(1+n)*n/2个元素。存储是为了使用,因此存储方式要使得访问矩阵中的某个元素时能很快找到它。可以实现一个映射函数——将矩阵元素​​a[i][j]​​​的下标映射为一维数组b[k]的下标,其中i、j从1开始到n,k从0到(1+n)*n/2-1。因此矩阵的​​a[i][j]​​​元素对应于一维数组的:① i≥j时是​​b[i(i-1)/2+j-1]​​​;② i<j时是​​b[j(j-1)/2+i-1]​​。

2.2.1.2 策略2

存储策略:只存储主对角线+下三角区的元素,并且按列优先原则将各元素存入一维数组中,因此需要存储(1+n)*n/2个元素。存储是为了使用,因此存储方式要使得访问矩阵中的某个元素时能很快找到它。可以实现一个映射函数——将矩阵元素​​a[i][j]​​​的下标映射为一维数组b[k]的下标,其中i、j从1开始到n,k从0到(1+n)*n/2-1。因此矩阵的​​a[i][j]​​​元素对应于一维数组的:① i≥j时是​​b[(2n-j+2)(j-1)/2+i-j]​​​;② i<j时是​​b[(2n-i+2)(i-1)/2+j-i]​​。


2.2.2 三角矩阵

2.2.2.1 上三角矩阵

上三角矩阵:除了主对角线和上三角区,其余的元素都相同,如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三对角矩阵_06


存储策略:按行优先原则将两个阴影部分合成的三角形区域的元素存入一维数组中,并在最后一个位置存储常量c,因此需要存储(1+n)*n/2+1个元素。可以实现一个映射函数——将矩阵元素​​a[i][j]​​​的下标映射为一维数组b[k]的下标,其中i、j从1开始到n,k从0到(1+n)*n/2。因此矩阵的​​a[i][j]​​​元素对应于一维数组的:① i≤j时是​​b[(2n-i+2)(i-1)/2+j-i]​​​;② i<j时是​​b[(1+n)*n/2]​​。

2.2.2.2 下三角矩阵

下三角矩阵:除了主对角线和下三角区,其余的元素都相同,如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三角矩阵_07


存储策略:按行优先原则将两个阴影部分合成的三角形区域的元素存入一维数组中,并在最后一个位置存储常量c,因此需要存储(1+n)*n/2+1个元素。可以实现一个映射函数——将矩阵元素​​a[i][j]​​​的下标映射为一维数组b[k]的下标,其中i、j从1开始到n,k从0到(1+n)*n/2。因此矩阵的​​a[i][j]​​​元素对应于一维数组的:① i≥j时是​​b[i(i-1)/2+j-1]​​​;② i<j时是​​b[(1+n)*n/2]​​。


2.2.3 三对角矩阵

三对角矩阵又称带状矩阵:当|i-j|>1时,有​​a[i][j]=0​​,其中1≤i,j≤n。

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_数组_08


存储策略:按行优先原则,只存储带状部分,因此需要存储3n-2个元素。可以实现一个映射函数——将矩阵元素​​a[i][j]​​​的下标映射为一维数组b[k]的下标,其中i、j从1开始到n,k从0到3n-3。因此矩阵的​​a[i][j]​​​元素对应于:① |i-j|>1时是0;② |i-j|≤1时是一维数组的​​b[2i+j-3]​​。

有一个问题,若已知数组下标k,如何得到矩阵的j,j?b[k]是数组中第k+1个元素,对应于矩阵的第​​i=⌈(k+2)/3⌉​​​行第​​j=k-2i+3​​列的元素,⌈m⌉是对m向上取整。


2.2.4 稀疏矩阵

稀疏矩阵是非零元素远远少于矩阵元素的个数的矩阵,总之就是0特别多,下面是一个示例:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三对角矩阵_09


存储策略1:使用顺序存储三元组<行,列,值>,如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三角矩阵_10


存储策略2:使用链式存储三元组<行,列,值>,即十字链表法,其中非零数据的结点如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三对角矩阵_11


全部结点如下:

一维/二维数组和普通/对称/三角/三对角/稀疏矩阵的存储_三角矩阵_12


上图中:绿色为向右域right,指向第i行的第一个元素,红色为向下域down,指向第j列的第一个元素。


END


标签:存储,一维,元素,矩阵,数组,2.2,对角
From: https://blog.51cto.com/u_14975310/6038450

相关文章

  • php去掉一维数组的键值的实例方法
    在PHP中,数组的每个元素都是由键值对(key-value)组成,通过元素的键名来访问对应键的值。提示:“索引”和“键名”指的是同一样东西,“索引”多指数组数字形式的下标。有时......
  • 力扣54. 螺旋矩阵
    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]......
  • 重塑矩阵
    在MATLAB中,有一个非常有用的函数reshape,它可以将一个 mxn矩阵重塑为另一个大小不同(rxc)的新矩阵,但保留其原始数据。给你一个由二维数组mat表示的 mxn矩阵,......
  • 矩阵的变换与逆矩阵
    矩阵的转置矩阵的行列互换    矩阵的逆有逆的矩阵一定是方阵,不是所有方阵都有逆。矩阵的逆运算也就是矩阵的除法,对应于实数运算中的倒数。    ......
  • latex矩阵
    1###########################################################################################################用&分隔列,用//分隔行\begin{equation*}\mathbfF= ......
  • 矩阵的概念和矩阵的运算
    矩阵的概念m*n矩阵,m是行数,n是列数小写字母一般表示数,大写字母一般表示矩阵单位矩阵指主对角线数字全为1,其他位置数字全为0的矩阵,一般用E或I表示    矩阵......
  • 算法刷题-单词接龙、矩阵中的最长递增路径、Z 字形变换
    单词接龙字典wordList中从单词beginWord__和endWord的**转换序列**是一个按下述规格形成的序列:序列中第一个单词是beginWord。序列中最后一个单词是endWord......
  • 搜索二维矩阵
    编写一个高效的算法来判断 mxn 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。/**......
  • 【C语言 数据结构】数组与对称矩阵的压缩存储
    文章目录​​数组的定义​​​​数组的顺序表示和实现​​​​顺序表中查找和修改数组元素​​​​矩阵的压缩存储​​​​特殊矩阵​​​​稀疏矩阵​​数组的定义提到数组......
  • 【Matlab学习2.5】稀疏矩阵
    矩阵的存储方式完全存储方式:将矩阵的全部元素按列存储。稀疏存储方式:只存储矩阵的非零元素的值及其位置,即行号和列号。注意,采用稀疏存储方式时,矩阵元素的存储顺序并没有......