高中信息技术-竞赛班数据结构专项培训教程-05矩阵的压缩存储教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
§ 5矩阵的压缩存储
§ 5.1 特殊矩阵
§ 5.1.1 三角矩阵与对称矩阵
设有矩阵 A : array [1..n , 1..n] of Atype ;
三角矩阵:
若A 的对角线以上(或以下)的元素均为零。 对称矩阵:
若A 中的兀素满足: a ij = a ji (1 w i , j w n ),
则称为n 阶对称矩阵。
为了节省存储空间,三角矩阵和对称矩阵都不需存储对角线以上 (或以下)的元
素,一般采用一维数组的结构。
此时需要
个元素的存储空间。
若将上三角矩阵中的元素按行顺序存储到
V 中,则V[k]与A[i, j]
k =
①
若将下三角矩阵中的元素按行顺序存储到
V 中,则V[k]与A[i, j]
0 a 22 a 23 a 24 a 25 0 0 a 33 a 34a 35 0 0 0 a 44 a 45 0 0 0 0 a 55
j
下三角矩阵
在n x n 的矩阵中,若所有非零元素均集中在以对角线为中的带状 区中,该带状区包括主对角线上面和下面各 k 条对角线以及主对角线上的元素,这种矩阵
称带状矩阵。
k=
②
an a 12 a 13 a 14 a 15
an 0 0 0 0、
a 21 a 22 0
0 0
a 31 a 32 a 33 0 0 a 41 a 42 a 43 a 44 0 .a 51 a 52 a 53 a 54 a 55 丿
上三角矩阵
( 、
an a 12 a 13 a 14 a 15 a 21 a 22 a 23 a 24 a 25 a 31 a 32 a 33 a 34 a 35 a 41 a 42 a 43 a 44 a 45 a 51 a 52 a 53 a 54 a 55 丿
对称矩阵
的对应关系是:
的对应关系是:
§ 5.1.2带状矩阵
1 23456789 10
f
1 123\0
0 '
4210 13^弋0
12768s
0s\2017911
00s11421
富00
0^<218 3 J
k=2的带状矩阵
k条对角线
在带状矩阵A中,i - j > k 或③时,A[ i , j ] = 0 。
对于带状区以外的0元素可不必存储,而只存储带状区中的元素。带状区中有
④个元素,但为了方便起见,每行当作2k+1个元素来存储,此时存储的元素个数为(2k+1) x n个。
【参考答案】:
①i x (i-1) / 2 + j
②(n+(n-i+1)) x (i-1) + (j-i+1)
③j - i > k
④n x n - (n-k) x (n - k - 1)
§ 5.2 稀疏矩阵
大多数元素的值为零的矩阵称为稀疏矩阵,为了节省存储空间,可以采取三元组或十字链表等方法来存储。
§ 5.2.1 三元组表示法
三元组表示法是用三元组(i , j , v )表示矩阵的每个非零元素。
第一行的i ,j , v分别表示矩阵A的行数、列数、非零元素个数,第二行开始的j,v 分别表示矩阵A中每个非
零元素的行下标、
【例5.2 1】
§ 5.2.2三元组矩阵转置
这里只讨论三元组的转置算法。
三元组的转置只需做到:
(1)将三元组中的行列值相互交换;
(2 )将i、j相互调换;
(3)重排三元组中的次序列下标、元素的值。
15 22
11 15 0
91
28 1
1
2
2
3
5
4
6
2
3
4
1
15
22
-15
11
3
-6
91
对矩阵的运算有许多,如两个矩阵相加、相乘、运算,对于一个mx n的矩阵M它的转置矩阵
(j , i 转置
•
N是
种简单的矩阵
…等。转置是
个n x m的矩阵,且M(i , j ) = N
)。
【例5.2 2】
14
1 23
N = 25
4 56
36J
就可实现三元组的矩阵转置。 这里关键是如何重排三元组里的次序。
「6 6 8 、
「6 6 8 、
『 6 6 8 3
1 1 15
1 1 15
1 1 15 1 4 2
2 4 1 22
1 5 91 1 6 -15 6 1 -15
2 2 11
T =
2 2 11
=>
2 2 11
B =
3 2 3 2 3 3 3 2 3
3 6 28
3 4-6
4 3-6
4 1 22
5 1 91 1 5 91
4 3-6 < 6 3
28 丿
< 3 6
28 丿
< 6
1 -15 丿
§ 5.2.2矩阵相乘
两个矩阵相乘是另一种常用的矩阵运算。 设: C = A X B
A=(a j )为mx s 的矩阵,B=(b j )是s X n 的矩阵,则矩阵 个m X n 的矩阵C=(5 ),其中
(i = 1 , 2 , …,m j = 1 , 2 , …,n )
对于非压缩矩阵,算法如下:
for i := 1 to m do
for j := 1 to n do begi n
C[ i , j ] := 0 ; for k := 1 to s do
C[ i , j ] := C[ i , j ] + A[ i , k ] * B[ k , j ]
;
end ;
当A 和B 是稀疏矩阵,并分别用三元组
M N 存储时,应如何处理?
注意1 :两个稀疏矩阵相乘的积不一定是稀疏矩阵;
2 :即使C ij = an bu + a i2®j + ............... + a is b sj 中的每个分项 akb kj 均不为零,其累加
值G 也有可能为零。
输入格式:
(输入文件
syz.in )
第1行:i1 j1 v1 ( 分别表示A 的行数、列数、非零兀素个数
第2至v1+1行: ai aj av ( 行下标、列下标、兀素的值 ) 第 v1+2 行:i2
j2 v2
(B
的行数、列数、非零兀素个数
)
第 v1+3 至 v1+v2+2 行: bi bj bv
输出格式: (输出文件
syz.out )
第1行:i3 j3
v3
(C
的行数、列数、非零兀素个数
)
【练习】输入 M N 两个三元组,分别表示 A 、B 两个稀疏矩阵,请计算 输出C 的(压
缩存储)三元组 Y 。
A 与矩阵
B 相乘将得到一
c ij = a i b ij
+ a i2 b 2j + + a is b sj
A 、
B 的乘积C,