三对角矩阵的压缩存储公式推导
数据结构实验五矩阵的压缩存储与运算学习资料

数据结构实验五矩阵的压缩存储与运算第五章矩阵的压缩存储与运算【实验目的】1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现;2. 掌握稀疏矩阵的加法、转置、乘法等基本运算;3. 加深对线性表的顺序存储和链式结构的理解。
第一节知识准备矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。
一、特殊矩阵的压缩存储1. 对称矩阵和上、下三角阵若n阶矩阵A中的元素满足= (0≤i,j≤n-1 )则称为n阶对称矩阵。
对n阶对称矩阵,我们只需要存储下三角元素就可以了。
事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。
问题已经转化为:已知二维矩阵A[i,j],如图5-1,我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。
任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里:k=i(i+1)/2+j (i≥j)图5-1 下三角矩阵a00 a10 a11 a20 … an-1,0 … an-1,n-1k= 0 1 2 3 …n(n-1)/2 …n(n+1)/2-1图5-2下三角矩阵的压缩存储反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。
这里,i=d-1,(d是使sum= > k的最小整数),j= 。
2. 三对角矩阵在三对角矩阵中,所有的非零元素集中在以主对角线为中心的带内状区域中,除了主对角线上和直接在对角线上、下方对角线上的元素之外,所有其它的元素皆为零,见图5-3。
规律分布特殊矩阵的压缩存储

【本节要点】
= Loc( A[ 1 ][ 1 ])+( 2 ( i-1 )+ j -1)*size
1、 规律分布特殊矩阵的压缩存储原则:按规律存放非零元素;
2、 按规律找出地址计算公式
思考题:类同按行为主序,请给出按列或按行为主序条件下上三角矩阵以及对称矩阵的 相关推导。 2 .带状矩阵
( 1 )带状矩阵描述:在矩阵中的所有非零元素都集中在以主对角线为中心的带状区域中。 其中最常见的是三对角带状矩阵,如图 3 所示。
a11 A12
a21 A22 a23
A32 a33 a34
( 2 )三对角带状矩阵特点
数组 C
a11 a12 a21 a22 a23 a31 … ann
Loc(i,j)
1 2 3 4 5 6 … 3n-2
图 4 带状矩阵的压缩形式
②确定非零元素在一维数组空间中的地址 Loc ( A[ i][ j])= Loc ( A[ 1 ][ 1 ])+(前 i-1 行非零元素个数+第 i 行中 aij 前非零元素个
数)*size 前 i-1 行元素个数=3 ×( i-1 )- 1 (因为第 1 行只有 2 个非零元素); 第 i 行中 ai j 前非零元素个数=j-i +1 ,其中
j-i=
-1 ( j<i) 0 (j=i) 1 (j>i)
三对角矩阵压缩存储

三对角矩阵压缩存储三对角矩阵是一种特殊类型的矩阵,在存储和计算上具有一定的优势。
本文将从三对角矩阵的定义、特性、压缩存储方法以及相应的计算算法等方面进行介绍。
一、三对角矩阵的定义三对角矩阵是指除了主对角线上的元素外,只有上下相邻对角线上的元素不为零,其余元素都为零的矩阵。
例如,一个n阶的三对角矩阵可以表示为:\[ A = \begin{bmatrix}b_1 & c_1 & 0 & \cdots & \cdots & \cdots & 0 \\a_2 & b_2 & c_2 & 0 & \cdots & \cdots & 0 \\0 & a_3 & b_3 & c_3 & 0 & \cdots & 0 \\\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\0 & \cdots & \cdots & \cdots & \cdots & a_{n-1} & b_{n-1} \\ 0 & \cdots & \cdots & \cdots & \cdots & 0 & a_n \\\end{bmatrix} \]其中,b1, b2, ..., bn为主对角线上的元素;a2, a3, ..., an为下对角线上的元素;c1, c2, ..., cn-1为上对角线上的元素。
二、三对角矩阵的特性1. 三对角矩阵是一种稀疏矩阵,大部分元素都为零,只有O(n)个非零元素。
2. 三对角矩阵可以用来表示一些特定问题的线性方程组,如一维热传导方程、抛物线偏微分方程等。
第4章专题3矩阵的压缩存储

三元组表=( (0,0,15), (1,1,11), (2,3,6), (4,0,9) ) 如何存储三元组表?
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
稀疏矩阵的压缩存储——三元组顺序表 采用顺序存储结构存储三元组表
15 0 0 22 0 -15
0 11 3 0 0 0
A=
0 0
0 0 a43 a44 a45 0 0 0 a54 a55
(a) 三对角矩阵
按行 存储
元素aij在一维数组中的序号
=2 + 3(i-2)+( j-i + 2) =2i+ j -2 ∵一维数组下标从0开始
∴元素aij在一维数组中的下标
= 2i+ j -3
(b) 寻址的计算方法
0 1 2 3 4 5 6 7 8 9 10 11 12
0 0
0 0
6 0
0 0
0 0
91 0 0 0 0 0
三元组顺序表是否 需要预留存储空间?
稀疏矩阵的修改操作
三元组顺序表的插入/删除操作
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
稀疏矩阵的压缩存储——三元组顺序表
采用顺序存储结构存储三元组表
15 0 0 22 0 -15
0 11 3 0 0 0
上三角中的元素aij(i<j),因为aij=aji,则访问和 它对应的元素aji即可,即:k=j×(j+1)/2+i -1 。
清华大学出版社
数据结构(C++版)第2版
4.3 矩阵的压缩存储
特殊矩阵的压缩存储——三角矩阵
三对角矩阵的压缩存储公式推导

三对角矩阵的压缩存储公式推导标题:深入探讨三对角矩阵的压缩存储公式推导在线性代数和数值计算中,三对角矩阵是一类特殊的矩阵,它在科学计算、工程问题和物理建模中有着广泛的应用。
三对角矩阵的压缩存储公式是对其特殊结构的一种有效利用,本文将深入探讨三对角矩阵的性质以及推导其压缩存储公式,帮助读者更好地理解和应用这一重要概念。
一、三对角矩阵的定义及性质三对角矩阵是指除了主对角线上的元素外,只有相邻对角线上的元素不为零的矩阵。
它具有以下的性质:1. 三对角矩阵是一种特殊的带状矩阵,具有较强的结构性质;2. 由于其大部分元素为零,因此可以采用压缩存储方式来节省存储空间;3. 在数值计算中,三对角矩阵往往会出现在线性方程组的求解、差分方程的离散化、特征值计算等问题中,因此了解其压缩存储公式对于优化算法和提高计算效率具有重要意义。
二、三对角矩阵的压缩存储公式推导三对角矩阵的压缩存储公式是一种基于其特殊结构的存储方式,可以将其非零元素存储在一个更小的数组中,从而节省存储空间和提高计算效率。
下面我们将对三对角矩阵的压缩存储公式进行推导。
假设我们有一个n阶的三对角矩阵A,其一般形式如下:\[ A = \begin{pmatrix} a_1 & b_1 & 0 & 0 & \cdots & \cdots & 0 \\ c_1 & a_2 & b_2 & 0 & \cdots & \cdots & 0 \\ 0 & c_2 & a_3& b_3 & 0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \ddots & \ddots & \vdots & \vdots \\ 0 & \cdots & \cdots & c_{n-2} &a_{n-1} & b_{n-1} & 0 \\ 0 & \cdots & \cdots & \cdots & c_{n-1} & a_n \end{pmatrix} \]为了压缩存储这个矩阵,我们可以使用两个数组来存储非零元素,一个数组存储矩阵的对角线上的元素,另一个数组存储矩阵相邻对角线上的元素。
数据结构(数组和广义表)习题与答案

1、以行序优先顺序存储数组A[5][5];假定A[0][0]的地址为1000, 每个元素占4个字节,下标变量A[4][3]的地址是____。
A.1069B.1092C.1023D.1046正确答案:B2、数组a[1..6][1..5] (无0行0列)以列序优先顺序存储,第一个元素a[1][1]的地址为1000,每个元素占2个存储单元,则a[3][4]的地址是____。
A.1040B.1026C.1046D.1038正确答案:A3、设有一个5行4列的矩阵A,采用行序优先存储方式,A[0][0]为第一个元素,其存储地址为1000,A[2][2]的地址为1040,则A[3][0]的地址为_________。
A.1048B.1024C.1096D.1060正确答案:A4、设有一个10行10列的矩阵A,采用行序优先存储方式,存储全部数据需要400个字节的空间。
如果A[0][0]为第一个元素,其存储地址为1000,则A[3][6]的地址为_________。
A.1036B.1144C.1014D.10565、设有一个10行10列的矩阵A,采用行序优先存储方式。
如果A[0][0]为第一个元素,其存储地址为1000,A[2][3]的存储地址为1069,则存储一个元素需要的单元数是_________。
A.4B.1C.2D.3正确答案:D6、不能够对数据元素进行随机访问的物理结构是_________。
A.三元组顺序表B.对称矩阵的压缩存储C.三对角矩阵的压缩存储D.数组的顺序存储正确答案:A7、对特殊矩阵采用压缩存储的目的主要是_________。
A.表达变得简单B.去掉矩阵中的多余元素C.对矩阵元素的存储变得简单D.减少不必要的存储空间正确答案:D8、对n*n的对称矩阵进行压缩存储,需要保存的数据元素的个数是_________。
A.nB.n(n+1)/2C.n2D.n(n+1)9、设10*10的对称矩阵下三角保存SA[1..55]中,其中A[1][1]保存在SA[1]中,A[5][3] 保存在SA[k]中,这里k等于_________。
稀疏矩阵及其压缩存储方法

稀疏矩阵及其压缩存储方法1.基本概念稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。
设m行n列的矩阵含t个非零元素,则称以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。
特殊矩阵:值相同的元素或0元素在矩阵中的分布有一定的规律。
如下三角阵、三对角阵、稀疏矩阵。
压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间。
目的是节省大量存储空间。
n x n的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。
2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构)三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。
它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
当矩阵中的非0元素少于1/3时即可节省存储空间。
(1)稀疏矩阵的三元组顺序表存储表示方法#define MAXSIZE 12500 // 假设非零元个数的最大值为12500typedef struct {int i, j; // 该非零元的行下标和列下标ElemType e; //非零元素的值} Triple; // 三元组类型typedef union { //共用体Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用int mu, nu, tu; // 矩阵的行数、列数和非零元个数} TSMatrix; // 稀疏矩阵类型(2)求转置矩阵的操作◆用常规的二维数组表示时的算法for (col=1; col<=nu; ++col)for (row=1; row<=mu; ++row)T[col][row] = M[row][col];其时间复杂度为: O(mu×nu)◆用三元组顺序表表示时的快速转置算法Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) {// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵TT.mu = M.nu; T.nu = M.mu; T.tu = M.tu;if (T.tu) {for (col=1; col<=M.nu; ++col) num[col] = 0;for (t=1; t<=M.tu; ++t) ++num[M.data[t].j];// 求M 中每一列所含非零元的个数cpot[1] = 1;for (col=2; col<=M.nu; ++col) cpot[col] = cpot[col-1] + num[col-1];// 求M 中每一列的第一个非零元在b.data 中的序号for (p=1; p<=M.tu; ++p) { // 转置矩阵元素col = M.data[p].j; q = cpot[col];T.data[q].i =M.data[p].j; T.data[q].j =M.data[p].i;T.data[q].e =M.data[p].e; ++cpot[col];} // for} // ifreturn OK;} // FastTransposeSMatrix其时间复杂度为: O(mu +nu)3.行逻辑联接的顺序表——压缩存储稀疏矩阵方法之二(链接存储结构)行逻辑联接的顺序表:稀疏矩阵中为了随机存取任意一行的非0元素,需要知道每一行的第一个非0元素在三元组表中的位置,因此将上述快速转置算法中指示行信息的辅助数组cpot 固定在稀疏矩阵的存储结构中,让每一行对应一个单链表,每个单链表都有一个表头指针,这种“带行链接信息”的三元组表即称为行逻辑联接的顺序表。
6.2三对角矩阵法

2
150
305.4.
3
150
319.3
4
150
333.2
5
150
347.0
V2=150 mol/h
平衡常数:
按(6-12)~(6-15)计算常数 A、B、C、D, 得到方程组的矩阵(6-16)的形式:
⎡−150
⎢ ⎢
100
⎢0
⎢ ⎢
0
⎢⎣ 0
244.5 − 344.5
100 0 0
0 325.5 525.5 200
j
Bi, j = −[Vj+1 + ∑ (Fm −Um −Wm ) −V1 + U j + (Vj +Wj )Ki, j ] m=1
Ci, j = Vj+1Ki, j+1 1 ≤ j ≤ N -1
Di, j = −Fj zi, j 1≤ j ≤ N
(6-12)
1≤ j ≤ N (6-13) (6-14) (6-15)
⎥⎢VN−1⎥ ⎢ γ N−2 ⎥
⎢⎣
αN-1 βN-1⎥⎦⎢⎣ VN ⎥⎦ ⎢⎣ γ N−1 ⎥⎦
(6-33)
逐级求解的通式:
Vj
=
γ
j−1
−α jVj−1 β j-1
⑥迭代终止标准:
(6-36)
ε T = ∑[(T j ) k − (T j ) k−1 ]2 ≤ 0.01N
(6-37) (6-38)
对于具有三对角线矩阵的线性方程组, 常用追赶法(或称托玛斯法)求解。该
法仍属高斯消元法。变换(6-16)第一行(式):
j=1:
Bi,1xi,1 + Ci,1xi,2 = Di,1 ,
三对角矩阵公式推导

三对角矩阵公式推导我们先定义一个三对角矩阵,记作A:\[A = \begin{bmatrix}a_1 & b_1 & 0 & 0 & \dots & 0 \\c_1 & a_2 & b_2 & 0 & \dots & 0 \\0 & c_2 & a_3 & b_3 & \dots & 0 \\\vdots & \vdots & \vdots & \ddots & \ddots & \vdots \\0 & \dots & 0 & c_{n-2} & a_{n-1} & b_{n-1} \\0 & \dots & 0 & 0 & c_{n-1} & a_n \\\end{bmatrix}\]我们想要找到一个矩阵B,使得A可以通过B的逆和B相乘得到。
如果我们能够找到相应的B,那么我们就可以得到A的逆矩阵。
通过观察,我们可以发现这个三对角矩阵有一些特点。
首先,对角线上的元素是$a_1, a_2, a_3, \dots, a_n$,即A的主对角线元素。
其次,A的上方对角线元素是$b_1, b_2, b_3, \dots,b_{n-1}$,下方对角线元素是$c_1, c_2, c_3, \dots, c_{n-1}$。
其他位置的元素都是零。
我们再来观察相应的矩阵B。
B的对角线上的元素是$b_1, b_2, b_3, \dots, b_{n-1}$,B的上方对角线元素是$c_1, c_2, c_3,\dots, c_{n-1}$,下方对角线元素是$c_1, c_2, c_3, \dots, c_{n-1}$。
其他位置的元素都是零。
根据矩阵乘法的定义,我们可以将矩阵B的逆矩阵写成如下形式:\[B^{-1} = \begin{bmatrix}d_1 & e_1 & 0 & 0 & \dots & 0 \\f_1 & d_2 & e_2 & 0 & \dots & 0 \\0 & f_2 & d_3 & e_3 & \dots & 0 \\\vdots & \vdots & \vdots & \ddots & \ddots & \vdots \\0 & \dots & 0 & f_{n-2} & d_{n-1} & e_{n-1} \\0 & \dots & 0 & 0 & f_{n-1} & d_n \\\end{bmatrix}\]要得到A的逆矩阵,我们需要通过B的逆和B相乘。
中南大学数据结构与算法第5章数组和广义表课后作业答案

第5章数组与广义表习题练习答案5.1请按行及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。
解:按行优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分行写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这里为了便于阅读,也将其书写为分行形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语言的三维数组地址计算公式。
解:因为C语言的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表示三维数组。
Loc(A000)表示数组起始位置。
i、j、k表示当前元素的下标,d表示每个元素所占单元数。
5.3设有三对角矩阵A n*n,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)用i , j 表示k的下标变换公式。
(2)用k 表示i,j 的下标变换公式。
严蔚敏版数据结构第五章

5
N维数组的数据类型定义
n_ARRAY = (D, R)
其中:
数据对象:D = {aj1,j2…jn| ji为数组元素的第i 维下标 ,aj1,j2…jn Elemset} 数据关系:R = { R1 ,R2,…. Rn } Ri = {<aj1,j2,…ji…jn , aj1,j2,…ji+1…jn >| aj1,j2,…ji…jn , aj1,j2,…ji+1…jn D } 基本操作:构造数组、销毁数组、读数组元素、写数组元素
6的每个元素占五个字节将其按列优先次序存储在起始地址为1000的内存单元中则元素a55的地址是南京理工大学2001一1315分12102二维数组m的元素是4个字符每个字符占一个存储单元组成的串行下标k的范围从0到4列下标j的范围从0到5m按行存储时元素m35的起始地址与m按列存储时元素m43的起始地址相同
10
二维数组
三维数组
行向量 下标 i 列向量 下标 j
页向量 下标 i 行向量 下标 j 列向量 下标 k
11
三维数组
– 各维元素个数为 m1, m2, m3 – 下标为 i1, i2, i3的数组元素的存储地址: – (按页/行/列存放)
LOC ( i1, i2, i3 ) = a + ( i1* m2 * m3 + i2* m3 + i3 ) * l 前i1页总 第i1页的 元素个数 前i2行总
前i行元素总数 第i行第j个元素前元素个数
24
若 i j,数组元素A[i][j]在数组B中的存 放位置为 n + (n-1) + (n-2) + + (n-i+1) + j-i = = (2*n-i+1) * i / 2 + j-i = = (2*n-i-1) * i / 2 + j 若i > j,数组元素A[i][j]在矩阵的下三角 部分,在数组 B 中没有存放。因此,找它 的对称元素A[j][i]。 A[j][i]在数组 B 的第 (2*n-j-1) * j / 2 + i 的位置中找到。
只存放下三角部分由于对称矩阵关于主对角线对称

a 00
a10
a11
a20
a21
a22
... ... ... ... ...
an10 an11 an12 ... an1n1
(a) 一个下三角矩阵
0123 45 a00 a10 a11 a20 a21 a22
67
……n
( n 1) 2
-3
a30 a31 ……
an-1n-3
n ( n 1) 2
(a) 上三角矩阵
(b)下三角矩阵
图 3-2 三角矩阵
• 对角矩阵
若矩阵中所有非零元素都集中在以主对角线为中心的带状区 域中,区域外的值全为0,则称为对角矩阵。常见的有三对 角矩阵、五对角矩阵、七对角矩阵等。
例如,图3-3为77的三对角矩阵(即有三条对角线上元素非
0)。
a00 a01 0 0 0 0 0
-2
n ( n 1) 2
-1
an-1n-2
an-1n-1
(b) 下三角矩阵的压缩存储形式
图 3-4 对称矩阵及用下三角压缩存储
(1)只存放下三角部分
由于对称矩阵关于主对角线对称,故我们只需存放主 对角线及主对角线以下的元素。这时, a[0][0]存入 s[0],a[1][0] 存入s[1],a[1][1]存入 s[2],…,具体参 见图3-4。这时s[k]与a[i][j]的对应关系为:
2. 多维数组在计算机内的存放
由于数组一般不作插入或删除操作,也就是说, 一旦建立了数组,则结构中的数组元素个数和元 素之间的关系就不再发生变动,即它们的逻辑结 构就固定下来了,不再发生变化。因此,采用顺 序存储结构表示数组是顺理成章的事了。本章中, 仅重点讨论二维数组的存储,三维及三维以上的 数组可以作类似分析。
课后习题Word

第三章课后习题3.3.2 对角矩阵的压缩存储所谓对角矩阵是指矩阵中的所有非零元素都集中在以主对角线为中心的带状区域中,即除了主对角线上和直接在主对角线上、下方对称的若干条对角线上的元素之外,其余元素均为零。
下面给出的矩阵B就是一个对角矩阵(确切地说是一个三对角矩阵,这里,我们仅以三对角矩阵为例子)。
三对角矩阵一共有3n—2个非零元素。
我们可以按照某个原则(或者以行序为主序的分配方式,或者以列序为主序的分配方式,或者按照对角线的顺序进行分配)将对角矩阵B的所有非零元素压缩存储到一个一维数组LTB[3n—2]中。
这里,不妨仍然以行序为主序的分配方式对B进行压缩存储,当B中任一非零元素Bij与LTB[k]之间存在着如下一一对应关系k=2*i+j-3时,则有Bij=LTB[k]。
称LTB[3n—2]为对角矩阵B的压缩存储,如下图所示。
上面讨论的几种特殊矩阵中,非零元素的分布都具有明显的规律,因而都可以被压缩存储到一个一维数组中,并且能够确定这些矩阵的每一个元素(或非零元素)在一维数组中的位置。
但是,对于那些非零元素在矩阵中的分布没有规律的特殊矩阵(如稀疏矩阵),则需要寻求其他的方法来解决压缩存储问题。
3.5 稀疏矩阵的十字链表表示上一节讨论了用三元组表的形式来存储一个稀疏矩阵的方法。
但是,在实际应用中,当稀疏矩阵中非零元素的位置或者个数经常发生变化时,使用三元组表就不太方便了。
本节将介绍稀疏矩阵的另一种表示方法,即十字链表表示。
如何用链表形式来表示一个稀疏矩阵呢?方法之一就是将所有非零元素以行序为主序方式(当然也可以以列序为主序方式)采用循环链表链接起来。
链结点的构造由四个域组成:其中i,j分别表示某一个非零元素所在的行号与列号;value表示该非零元素的值;link 域用来指向下一个非零元素所在的链结点,它是一个指针。
另外,再设置一个链表头结点,其构造如下:其中,m,n分别表示稀疏矩阵的行数与列数;t为稀疏矩阵非零元素的总个数;link域用来指向第一个非零元素对应的链结点。
三对角矩阵压缩存储转置

三对角矩阵压缩存储转置实验题目:实验八——矩阵实验程序设计2问题分析:1、题目要求:设计算法求三对角矩阵在压缩存储下的转置矩阵2、设计思路:定义一种新的数据结构三元组用来存放数据,该数据结构为以一维数组,结点包括三个量i、j、v,i、j分别用来记录矩阵中元素的下标,v用来记录元素值,这样交换时,仅对下标交换即可达到转置矩阵的目的3、输入与输出:只需输入三对角矩阵中所有非零元素的值,存放在三元组里,输出时,程序自动在没有数字元素处补零,以矩阵形式输出;4、转置:调用转置函数进行转置,转置时仅交换数据的下标5、测试数据:A、输入矩阵阶数:4输入第一行的两个元素:1 2输入第二、三行的元素,各三个:4 5 67 8 9输入最后一行的两个元素:3 8预测结果:原矩阵:转置后矩阵:1 2 0 0 1 4 0 04 5 6 0 2 5 7 00 7 8 9 0 6 8 30 0 3 8 0 0 9 8B、输入矩阵阶数:5输入第一行的两个元素:12 45输入第二、三行的元素,各三个:77 88 9944 55 6611 22 33输入最后一行的两个元素:14 82预测结果:原矩阵:转置后矩阵:12 45 0 0 0 12 77 0 0 077 88 99 0 0 45 88 44 0 00 44 55 66 0 0 99 55 11 00 0 11 22 33 0 0 66 22 140 0 0 14 82 0 0 0 33 82概要设计:1、为了实现上述程序功能,需定义三元组数据结构用来存储数据,建立三元组输入函数,输出函数和矩阵转置函数,最后在屏幕上输出结果;2、本程序包含4个函数:⑴主函数main()⑵三对焦矩阵建立函数Setmatrix()⑶转置函数Trabsmatrix()⑷输出函数Tsmatrixout()各函数关系如下:详细设计:1、数据结构与结点类型:typedef struct //定义结点类型{int i,j,v;}node;typedef struct //定义矩阵类型{node data[max];}TSmatrix;2、各函数的基本操作⑴三对角矩阵的建立函数TSmatrix *Setmatrix(){申请空间;输入第一行的两个元素;输入2~n-1行的元素,每行3个;返回;}⑵转置函数TSmatrix *Trabsmatrix(TSmatrix *T){建立新的三元组;把原三元组数据下标交换,放入新组;返回新三元组;}⑶输出函数void TSmatrixout(TSmatrix *T){定义变量a 、b=0;如果三元表中数据下表等于a 、b 的值,则输出该元素;否则,输出0;a++’;b++;}main() Setmatrix() Trabsmatrix() Tsmatrixout()源代码:#include#include#define max 20typedef struct //定义结点类型{}node;typedef struct //定义矩阵类型{node data[max];int m;}TSmatrix;TSmatrix *Setmatrix() //建立三对角矩阵{TSmatrix *T;T=(TSmatrix *)malloc(sizeof(TSmatrix));printf("请输入矩阵阶数:");scanf("%d",&T->m);printf("建立三对角矩阵:\n");printf("输入第一行的两个数:\n"); //第一行只有两个元素,单独输入 scanf("%d %d",&T->data[0].v,&T->data[1].v);T->data[0].i=0;T->data[0].j=0;T->data[1].i=0;T->data[1].j=1;printf("输入第二行至第%d行的数(每行3个):\n",T->m-1);int t=2;for(int p=1;pm-1;p++) //循环输入2~n-1行的元素,每行3个for(int q=p-1;q<p+2;q++)< p="">{T->data[t].j=q;T->data[t].i=p;scanf("%d",&T->data[t].v);t++;}printf("输入最后一行的两个数:\n"); //输入最后一行的两个元素scanf("%d %d",&T->data[3*T->m-4].v,&T->data[3*T->m-3].v);T->data[3*T->m-4].i=T->m-1;T->data[3*T->m-4].j=T->m-2;T->data[3*T->m-3].i=T->m-1;T->data[3*T->m-3].j=T->m-1;return T;}TSmatrix *Trabsmatrix(TSmatrix *T) //三对角矩阵转置{int n,temp;TSmatrix *F;F=(TSmatrix *)malloc(sizeof(TSmatrix));F->m=T->m;for(n=0;n<3*T->m-2;n++){ //将结点信息存入新三元组表中temp=2*(T->data[n].j)+(T->data[n].i); //计算待存入三元数组下标F->data[temp].i=T->data[n].j; //进行交换F->data[temp].j=T->data[n].i;F->data[temp].v=T->data[n].v;}return F;}void TSmatrixout(TSmatrix *T) //三对角矩阵输出{int a,b,n;n=0;for(a=0;am;a++){ //输出三对角矩阵,下标只有数据则输出对应元素值for(b=0;bm;b++){ //否则输出0if((T->data[n].i==a)&&(T->data[n].j==b)){printf("%d ",T->data[n].v);n++;}elseprintf("0 ");}printf("\n");}}void main(){TSmatrix *T;T=Setmatrix();printf("原三对角矩阵:\n");TSmatrixout(T);T=Trabsmatrix(T);printf("转置后三对角矩阵:\n");TSmatrixout(T);}调试分析:1、进行矩阵转置时本来采用把两数据进行交换的方法,但这样做容易使程序变的复杂,可读性变差,于是采用交换数据下标的方式,使思路更加清晰,也便于操作。
北京师范大学数据结构教学资料 第4章——数组、串与广义表

精选ppt
25
设矩阵 A 中有 s 个非零元素。令 e = s/(m*n), 称 e 为矩阵的稀疏因子。
有人认为 e≤0.05 时称之为稀疏矩阵。 在存储稀疏矩阵时,为节省存储空间,应只
存储非零元素。但由于非零元素的分布一般 没有规律,故在存储非零元素时,必须记下 它所在的行和列的位置 ( i, j )。 每一个三元组 (i, j, aij) 唯一确定了矩阵A的一 个非零元素。因此,稀疏矩阵可由表示非零 元的一系列三元组及其行列数唯一确定。
精选ppt
26
稀疏矩阵的定义
const int drows = 6, dcols = 7, dterms = 9;
template<class E>
struct Triple {
//三元组
int row, col;
//非零元素行号/列号
E value;
//非零元素的值
void operator = (Triple<E>& R) //赋值
a1 1
a2 1 an1 1
a1 2
a2 2 an1 2
aaan12n1nn111
下 三 角 矩 阵
01 2 3 4 5 6 7 8
n(n+1)/2-1
B a00 a10 a11 a20 a21 a22 a30 a31 a32 …… an-1n-1
若 i j, 数组元素A[i][j]在数组B中的存放位置 为 1 + 2 + + i + j = (i + 1)* i / 2 + j
前i行(0~i-1)元素总数 第i行第j个元素前元素个数
精选ppt
18
带状矩阵的多向量压缩存储

m, 满足 当 l— ii I≥m时 ,oO 这 时称 w 2 一 a= , = n 1为矩 阵 A的带宽 .带状矩 阵也 称为 对角 矩阵 ,= ( 2 w 3m= )
3带 状矩 阵的 多向量压 缩存储 .
的带状矩阵称之为三对角矩阵. 由此可知 , 在这种矩
1 m j , : > m
压 缩 方 法 二是 将 带 状 矩 阵 A压 缩 到 一 个 W行
对 于特殊 矩 阵 , 由于其 非零 元 素的分 布都 有一
定的规律 ,所 以可以将其压缩存储在一个一维数组 中,并且建立起每个非零元素在矩阵中的位置与其 在一维数组 中的位置之间的对应关系. 本文打破陈 规, 将一个带状矩阵压缩存储到一个多向量 中去 , 此 种压缩存储方法和传统的压缩存储方法比较 ,多了 个单元 的空间. 但是相对一维数组来讲多 向量压
那么 a映射为 bI , j I - 映射关系为: j r
作者简 介: 任志 国(9 7 )男 , 17 一 , 甘肃古浪人 , 讲师. 研究方向 : 信息科 学与图论
4 6
第l 5卷第 2期(0 0 2 1)
l = i i
任 志国等 : 带状矩 阵的多向量压缩存储
4 总 结 .
a l a2 0 I 1
a21 a2 2 a2 3
条对角线的元素外 ,所有其 它元素都为零或 同一 个常数.
2 带状矩 阵的单 向量压 缩存储 . 对 于 w 3的 5阶 带状 矩 阵 图 1常用 的一 种 压 = 缩方 法是 将带状 矩阵 压缩到 向量 B3— 1 [n l中去 , 以行 为主序顺 序 的存储 其非 零元 素 , 向量 Bk中 , BO [ ] 从 [] 到 B3 一 件I 矩 阵 A 中三条对 角 线上 的元 素 , [n 1 存放 B
对称矩阵的压缩存储公式

对称矩阵的压缩存储公式对称矩阵是一种特殊的方阵,其特点是以对角线为中心,左上角和右下角对应的元素相等。
由于对称矩阵具有一定的规律性,可以通过压缩存储来节省空间和计算资源。
压缩存储是一种将矩阵中冗余的信息进行压缩,只保留有效数据的方法。
对称矩阵的压缩存储公式利用了矩阵的对称性质,减少了存储的数据量。
具体而言,对称矩阵的压缩存储使用一维数组来存储只有一半的元素,通过合理的编码方式来表示原始矩阵中未存储的对称元素。
这种存储方式主要适用于矩阵中非零元素较少的情况。
对称矩阵的压缩存储公式如下:设原始对称矩阵为A,维度为n*n。
由于对称矩阵以对角线为中心,左上角和右下角的元素相等,因此只需存储上三角或下三角的元素。
以存储上三角为例,选取一维数组B,长度为n*(n+1)/2。
具体存储过程如下:1. 从整个矩阵的第一行开始,按照行的顺序依次存储上三角的元素,即i从1到n,j从i到n。
2. 元素A[i][j]在矩阵中的位置对应的一维数组下标为B[i*(n+1)/2 + j - i]。
这样,通过压缩存储,我们只需存储上三角或下三角中的元素,大大减少了存储空间的使用。
对称矩阵的压缩存储不仅仅可以节省存储空间,还可以提高计算效率。
在对称矩阵的运算中,通过压缩存储,我们只需对存储的有效元素进行操作,无需处理冗余元素,从而减少了计算的复杂度。
除了基本的压缩存储公式,还有一些其他的方法可以进一步优化压缩存储的效果。
例如使用差分编码或二次差分编码来表示相邻元素的差异,进一步减少存储的数据量。
此外,可以利用稀疏矩阵的特点,将零元素进一步压缩存储,提高存储的效率。
总之,对称矩阵的压缩存储通过利用对称性质,以及合理的编码方式,可以在不影响矩阵运算结果的前提下,大大减少存储空间和计算资源的使用。
在实际应用中,我们可以根据矩阵的特点选择适当的压缩存储方法,以达到更好的效果。
对称矩阵的压缩存储

对称矩阵的压缩存储
对称矩阵是一种特殊的矩阵,其元素对称分布于矩阵的主对角线两侧,并且两侧的元素值相等。
对称矩阵的压缩存储是在保留矩阵对称性的基础上,对矩阵的非零元素进行压缩存储的一种方法。
对称矩阵的压缩存储可以有效地减少存储空间和计算量,并且可以提高计算的效率。
一般情况下,对称矩阵的存储需要使用n x n个实数空间,其中n是矩阵的阶数。
但是,由于矩阵的对称性,只有主对角线以上的元素与主对角线以下的元素不同。
因此,可以将矩阵的主对角线以上的元素作为压缩存储的数据,并将这些元素按照一定的次序存储在一个一维数组中。
对称矩阵的压缩存储有两种常用的方式:上三角压缩存储和下三角压缩存储。
上三角压缩存储
隐式存储的方式则是将对称矩阵的上三角部分压缩为一个一维数组。
由于对称矩阵的上三角部分的元素数目为n(n-1)/2,因此只需要一个长度为n(n-1)/2的一维数组就可以存储矩阵的上三角部分。
按照某种显式或隐式的方式存储该数组即可。
例如,可以按照每一行从左到右,从上到下的顺序存储该数组,即先将第一行的元素存到数组的前n-1个位置中,再将第二行的元素存到数组的第n到n+2个位置中,依此类推,直至将最后一行的元素存到数组的最后n-1个位置中。
对称矩阵的压缩存储可以在一定程度上减少存储空间和计算量,并且可以提高计算的效率。
但是,压缩存储也带来了一些不便。
首先,压缩存储带来了额外的计算开销,需要将压缩后的数据重构为矩阵形式才能进行计算。
其次,压缩存储可能会导致内存访问的不连续性,从而降低计算的效率。
因此,在实际应用中,需要根据具体情况选择是否采用对称矩阵的压缩存储方式。
对角矩阵压缩算法

对⾓矩阵压缩算法
对⾓矩阵压缩算法
以44对⾓矩阵为例⼦
⾸先我们得知道对⾓矩阵的概念对⾓矩阵(diagonal matrix)是⼀个主对⾓线之外的元素皆为0的矩阵,常写为diag(a1,a2,...,an) 。
对⾓矩阵可以认为是矩阵中最简单的⼀种,值得⼀提的是:对⾓线上的元素可以为 0 或其他值,对⾓线上元素相等的对⾓矩阵称为数量矩阵;对⾓线上元素全为1的对⾓矩阵称为单位矩阵—来⾃百度百科。
⽐如 1 2 0 0
5 4 3 0
0 1 2 3
0 0 2 3
我们可以发现三对⾓矩阵⾸⾏和尾⾏分别有2个⾮0元素,其余⾏都是3个⾮0元素
推⼴⾄在有n ⾏的情况⾮0 元素 3(n-2)+4=3n-2
推算下标k值
对数组a【i】【j】分配⾄对⾓矩阵前i⾏中有(i-1)3+2根据对⾓线推元素位⼦得不是i-j+1就是j-i+1所以k=(i-1)3+2+j-i+1=i2+j
所以我们可以⽤k的值来推算i,j i=(k+1)/3
J=k-2*i;
得出k于i,j的关系后便可以将矩阵进⾏压缩从⽽避免了0元素的空间占⽤,直接将矩阵压缩。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三对角矩阵的压缩存储公式推导
三对角矩阵是指除了主对角线上的元素,只有主对角线上方和下方相邻的两条对角线上的元素不为零,其余元素都为零的矩阵。
压缩存储是指将矩阵中的非零元素存储在一个一维数组中。
假设一个n阶的三对角矩阵为A,可以表示为:
A = [a[i][j]] 0 < |i - j| <= 1
其中a[i][j]为矩阵A的元素。
我们需要将A压缩存储到长度为n的一维数组B中。
推导压缩存储的过程如下:
1. 创建一个长度为3n-2的一维数组B,用于存储矩阵A的非
零元素。
2. 遍历矩阵A中的每个元素a[i][j],判断其在数组B中的位置。
a) 当 i = j 时,a[i][j]为主对角线上的元素,存储在数组B的
第i个位置。
b) 当 i = j+1 时,a[i][j]为主对角线上方的元素,存储在数组
B的第n-1+j个位置。
c) 当 i = j-1 时,a[i][j]为主对角线下方的元素,存储在数组
B的第2n-1+j个位置。
3. 遍历完成后,数组B中存储了矩阵A的所有非零元素。
即可得到三对角矩阵A的压缩存储公式:
B[i] = a[i][i] (i = 1, 2, ..., n)
B[n-1+j] = a[j+1][j] (j = 0, 1, ..., n-2)
B[2n-1+j] = a[j][j+1] (j = 0, 1, ..., n-2)
其中B为存储矩阵A的一维数组。