概念:
科学与工程计算有一个特殊的数学对象,那就是矩阵。如何将矩阵中的各个元素存储在计算机中,数组就是一个很好的选择。我们通常会遇到三种类型的矩阵:
- 普通矩阵
- 特殊矩阵:对称矩阵、上三角矩阵、下三角矩阵、对角矩阵等
- 稀疏矩阵
特殊
特殊矩阵和稀疏矩阵压缩存储的目的是节省存储空间。矩阵的下标是从1开始,而将改矩阵压缩成内存中的一维空间时,与该一维空间所对应的数组下标是从0开始。
1. 对称矩阵:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11a21a31⋮ai1a12a22a32⋮ai2a13a23a33⋮ai3⋯⋯⋯⋱⋯a1ja2ja3j⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
性质:
- 在n阶矩阵A中的元素满足 : aij = aji ( 1≤ i , j≤n );
- 压缩策略:只存储上三角或下三角的元素。所需空间 n(n+1)2
- 一维数组sa[
n(n+1)2
] 存储以行序为主序的下三角(包括对角线),其地址的运算,即
aij
和sa[k] 之间存在如下对应关系:
k=⎧⎩⎨⎪⎪i(i−1)2+j−1,j(j−1)2+i−1,i ≥ j,对角线元素和下三角元素i < j,上三角元素
2. 上三角与下三角矩阵:
上三角矩阵: ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11mm⋮ma12a22m⋮ma13a23a33⋮m⋯⋯⋯⋱⋯a1ja2ja3j⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
下三角矩阵: ⎡⎣⎢⎢⎢⎢⎢⎢⎢a11a21a31⋮ai1ma22a32⋮ai2mma33⋮ai3⋯⋯⋯⋱⋯mmm⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥
3. 对称矩阵:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11a210000a12a22a320000a23a33a430000a34a44a540000a45a55a650000a56a66⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
4. 稀疏矩阵:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢00−3001512000180900240000000−70000000014000000000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
性质:
- 稀疏矩阵:零元素个数远远大于非零元素的个数。
- 稀疏因子:在m × n的矩阵中,t个元素不为0,δ = tm×n ,称δ为矩阵的稀疏因子。
- 通常认为δ≤0.05时称为稀疏矩阵。
压缩存储方法:
三元组顺序表(顺序存储结构)
#define MAXSIZE 12500//非零元素最大个数
typedef struct{
int i,j;//非零元素的行下标、列下标
elemtype e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];//data[0]未用 int mu,nu,tu;//行数、列数、非零元素个数
}TSMatrix;
- 行逻辑连接的顺序表(链式存储结构)
有时为了提高效率,可以随机存储任意一行的非0元素,这样,就需要知道每一行的第一个非0元素在三元组表中的位置。为此可以添加一个辅助数组来实现:
typedef struct{
Triple data[MAXSIZE+1];// data[0]未用
int rpos[MAXCO+1]// 各行第一个非零元的位置表,rpos [0]未用
int mu,nu,tu;//行数、列数、非零元素个数
}RLSMatrix;
- 十字链表(链式存储结构)
将每行的非0元素组成一个链表,每列的非0元素组成一个链表。链表中的每个结点有5个域,有3个域与三元组中信息一样,保存行标、列标、元素值。剩下的2个域分别保存所在行下一个元素和所在列下一个元素。
最后将行链表的头指针组成一个数组,将列链表的头指针组成另一个数组,这样就形成了一个十字交叉的链表。