特殊矩阵的压缩存储(公式详解)

特殊矩阵指的是具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布具有一定规律性的矩阵(例如:对称矩阵、上或下三角矩阵、对角矩阵等);而压缩存储指的是将多个值相同的元素只分配给一个存储空间,而对零元素不分配空间。因此特殊矩阵的压缩存储方法是找出特殊矩阵中值相同的矩阵元素的分布规律,并把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中。

一、对称矩阵

若对一个n阶矩阵A中的任意一个元素 ai,j 都有 ai,j = aj,i(1<=i,j<=n),则称其为对称矩阵。其中的元素可以划分为三个部分,即上三角区、主对角线和下三角区。

1. 压缩存储所需的空间大小

对于n阶对称矩阵,上三角区的所有元素和下三角区的对应元素相同,若将所有元素都存放起来的话,会浪费几乎一半的空间,为此可以只存放对称矩阵的上或下三角部分(含主对角)的元素。

以存放下三角部分为例,如果要将n阶对称矩阵A存放在一维数组B中,那么B所需的空间大小为n(n+1)/2(即1+2+……+n,等差数列求和),元素 ai,j 存放在b[k]中。

2. 矩阵元素行号i、列号j与数组元素下标k之间的关系

矩阵元素ai,j的行号i和列号j通常是从1开始的,而数组元素b[k]的下标k通常是从0开始的。在计算i、j与k之间的对应关系时,假设只存放下三角区部分(含对角线,即i>=j的部分):

在数组B中,位于元素ai,j(i>=j)前面的元素个数为
第1行:1个元素(a1,1
第2行:2个元素(a2,1,a2,2
……
第i-1行:i-1个元素(ai-1,1,ai-1,2,……,ai-1,i-1)【前面i-1行满足i>=j的元素都要存储在B中】
第i行:j-1个元素(ai,1,ai,2,……,ai,j-1

因此,元素ai,j(i>=j)在数组B中的下标k=[1+2+……+(i-1)]+(j-1)=i(i-1)/2+j-1;而上三角区部分(即i<j的部分)i、j与k之间的关系就更好推导了,由于对称矩阵的元素满足ai,j = aj,i,所以ai,j 与aj,i在B上对应的存储空间是同一个,因此将i与j进行调换即可,即k=j(j-1)/2+i-1。

矩阵下标从1开始、数组下标从0开始:

3. 其他情况

二维数组A[n][n]和A[0…n-1][0…n-1]的写法是等价的,若二维数组元素写为A[i][j],则数组元素下标的i和j通常是从0开始的;
若数组写为A[1…n][1…n],则说明指定了从下标1开始存储元素;
矩阵元素通常写为ai,j或a(i)(j),这里的行号i与列号j是从1开始的。

我们在上述讨论了矩阵下标从1开始、数组下标从0开始的情况,下面讨论一下矩阵下标从0开始或数组下标从1开始的情况(都以存放含对角线的下三角区部分为例)。

1)矩阵下标从1开始、数组下标从1开始

2)矩阵下标从0开始、数组下标从0开始

3)矩阵下标从0开始、数组下标从1开始

4. 例题

① 有一个 nxn 的对称矩阵 A, 将其下三角部分按行存放在一维数组 B 中,而 A[0][0] 存放于 B[0] 中,则笫 i + 1 行的对角元素 A[i][i] 存放于 B 中的( )处。
A. (i + 3) × i / 2
B. (i + 1) × i / 2
C. (2n - i + 1) × i / 2
D. (2n - i - 1) × i / 2
A(矩阵下标从0开始、数组下标从0开始)

② 【2018 统考真题】设有一个 12x12 阶对称矩阵 M,将其上三角部分的元素 mi,j(1<=i<=j<=12)按行优先存入C语言的一维数组 N 中,元素 m6,6 在N 中的下标是( )。
A. 50
B. 51
C. 55
D. 66
A(上三角按行优先=下三角按列优先,矩阵下标从1开始、数组下标从0开始)

③ 【2020 统考真题】将一个 10x10 阶对称矩阵 M 的上三角部分的元素 mi,j(1<=i<=j<=10)按
列优先存入C语言的一维数组 N 中,元素 m7,2 在N 中的下标是( )。
A. 15
B. 16
C. 22
D. 23
C(上三角按列优先=下三角按行优先,矩阵下标从1开始、数组下标从0开始)

二、三角矩阵

下三角矩阵中,上三角区的所有元素均为同一常量;上三角矩阵中,下三角区的所有元素均为同一常量。

1. 压缩存储所需的空间大小

其存储思想与对称矩阵相似,不同之处在于存储完下三角区和主对角线上的元素之后,紧接着存储对角线上方的常量一次。

因此,如果要将n阶下三角矩阵A存放在一维数组B中,那么B所需的空间大小为n(n+1)/2+1。

2. 矩阵元素行号i、列号j与数组元素下标k之间的关系

以存储下三角区部分(含对角线,即i>=j的部分)为例,矩阵下标从1开始、数组下标从0开始:

3. 其他情况

1)矩阵下标从1开始、数组下标从1开始

2)矩阵下标从0开始、数组下标从0开始

3)矩阵下标从0开始、数组下标从1开始

4. 上三角矩阵采用行优先存储的应用

上三角矩阵采用行优先存储等价于下三角矩阵采用列优先存储。

在数组B中,位于元素ai,j(i<=j)前面的元素个数为
第1行:n个元素(a1,1,a1,2,……,a1,n
第2行:n-1个元素(a2,2,……,a2,n
……
第i-1行:n-i+2个元素(ai-1,i-1,……,ai-1,n)【前面i-1行满足i<=j的元素都要存储在B中】
第i行:j-1个元素(ai,i,……,ai,j-1

因此,元素ai,j(i<=j)在数组B中的下标k=[n+(n-1)+……+(n-i+2)]+(j-i+1)-1=(i-1)(2n-i+2)/2+(j-i)。

矩阵下标从1开始、数组下标从0开始:

1)矩阵下标从1开始、数组下标从1开始

2)矩阵下标从0开始、数组下标从0开始

3)矩阵下标从0开始、数组下标从1开始

5. 例题

① 若将 n 阶上三角矩阵 A 按列优先顺序压缩存放在一维数组 B[1…n × (n + 1) / 2 + 1] 中,则存放到 B[k] 中的非零元素 ai,j(1<=i, j<=n)的下标 i、j 与 k 的对应关系是( )。
A. i × (i + 1) / 2 + j
B. i × (i - 1) / 2 + j - 1
C. j × (j - 1) / 2 + i
D. j × (j - 1) / 2 + i - 1
C(上三角按列优先=下三角按行优先,矩阵下标从1开始、数组下标从1开始)

② 若将 n 阶下三角矩阵 A 按列优先顺序压缩存放在一维数组 B[1…n × (n + 1) / 2 + 1] 中,则存放到 B[k] 中的非零元素 ai,j(1<=i, j<=n)的下标 i、j 与 k 的对应关系是( )。
A. (j - 1) × (2 × n - j + 1) / 2 + i - j
B. (j - 1) × (2 × n - j + 2) / 2 + i - j + 1
C. (j - 1) × (2 × n - j + 2) / 2 + i - j
D. (j - 1) × (2 × n - j + 1) / 2 + i - j - 1
B(下三角按列优先=上三角按行优先,矩阵下标从1开始、数组下标从1开始)

三、三对角矩阵

对角矩阵也称带状矩阵,对n阶矩阵A中的任意一个元素ai,j,当|i-j|>1时,若有ai,j=0(1<=i,j<=n),则称为三对角矩阵。在三对角矩阵中,所有非零元素都集中在以对角线为中心的三条对角线的区域,其他区域的元素都为零。

1. 压缩存储所需的空间大小

如果要将n阶三对角矩阵A存放在一维数组B中,那么B所需的空间大小为4+3(n-2)。

2. 矩阵元素行号i、列号j与数组元素下标k之间的关系

可以计算出矩阵A中三条对角线上的元素ai,j(1<=i,j<=n,|i-j|<=1)在一维数组B中存放的下标为k=2i+j-3(矩阵下标从1开始、数组下标从0开始)。

元素ai,j的前i-1行中,除第1行只有两个元素外,其他的i-2行都有三个元素;第i行的三个元素的下标分别可以通过2+(j-i)来计算(j-i只有-1、0、1三种情况,而元素存储的下标分别需要增加1、2、3);又因为矩阵下标是从1开始,而数组下标是从0开始,因此从矩阵下标转换为数组下标时还要-1。可以推出矩阵元素行号i、列号j与数组元素下标k之间的关系为:2+3(i-2)+2+(j-i)-1=2i+j-3。

若已知三对角矩阵中的某个元素ai,j存放在一维数组B的第k个位置,则有i=⌊(k+1)/3+1⌋,j=k-2i+3。

由于数组下标是从0开始的,因此数组下标为k的元素是矩阵中的第k+1个非零元素,矩阵除了首尾外的每行都有三个非零元素,且矩阵的行号i是从1开始,所以(k+1)/3+1再向下取整就可以得到存放在数组B第k个位置的元素所在三对角矩阵中的行号i,根据k=2i+j-3,可以进一步的推出列号j。

3. 其他情况

1)矩阵下标从1开始、数组下标从1开始

k=2i+j-2,若已知三对角矩阵中的某个元素ai,j存放在一维数组B的第k个位置,则有i=⌊k/3+1⌋,j=k-2i+2。

2)矩阵下标从0开始、数组下标从0开始

k=2i+j+1,若已知三对角矩阵中的某个元素ai,j存放在一维数组B的第k个位置,则有i=⌊k/3+1⌋,j=k-2i-1。

3)矩阵下标从0开始、数组下标从1开始

k=2i+j+2,若已知三对角矩阵中的某个元素ai,j存放在一维数组B的第k个位置,则有i=⌊(k-1)/3+1⌋,j=k-2i-2。

4. 例题

① 将三对角矩阵 A[1…100][1…100] 按行优先存入一维数组B[1…298] 中,数组 A 中元素 A[66][65] 在数组 B 中的位置 k 为( B )。
A. 198
B. 195
C. 197
D. 196

② 【2016 统考真题】有一个100 阶的三对角矩阵 M,其元素 mi,j(1<=i, j<=100)按行优先依次压缩存入下标从 0 开始的一维数组 N 中。元素 m30,30 在 N 中的下标是( B )。
A. 86
B. 87
C. 88
D. 89

不要死记硬背公式,弄清公式的原理后学会自己推导,从而可以在做题时融会贯通、举一反三。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值