目录
矩阵如何存储在数组中
在C语言中,矩阵a是存储在数组a[m][n]中的。
如上图中的矩阵,即可存储在a[4][4]={{12,0,0,0},{0,14,0,0},{0,0,12,0},{0,0,0,12}}二维数组中。
什么样的矩阵可以有必要压缩存储?
一般的矩阵,各个元素都是非零元素,故不需要压缩存储,哪怕压缩存储压缩率也不是很高。
有必要压缩存储的矩阵是:特殊矩阵和稀疏矩阵。
特殊矩阵(相同元素或零元素在矩阵中分布比较有规律的矩阵)。
稀疏矩阵(矩阵中绝大多数元素都为0的矩阵)
特殊矩阵有哪些?如何压缩存储?
对称矩阵
矩阵中行标和列表互换位置的两个元素值相等,即:aij=aji。
压缩原理:只需存矩阵中一半的元素即可。
上三角矩阵、下三角矩阵
矩阵下三角部分全为同一值c(c可为0)的矩阵是上三角矩阵。
矩阵上三角部分全为同一值c(c可为0)的矩阵是下三角矩阵。
压缩原理:与对称矩阵类似,只存储对角线、相同元素c、对角线以上或以下部分的元素即可。
对角矩阵
除了主对角线及其上下两条带状区域内的元素外,其余元素均为c(c可为0)的矩阵是对角矩阵。
压缩原理:存储c以外,主对角线及其上下两条带状区域内的元素。
稀疏矩阵如何压缩呢?
方法一:三元组数据结构表示
typedef struct{
int val;//用来存储非零元素的值
int i,j;//用来存储非零元素在矩阵中的下标
}Tritype;
方法二:伪地址表示法(二元数据结构表示)
伪地址法需要先按照元素在矩阵中按行优先或列优先的确定非零元素的序列数,即用一个顺序数表示非零元素的相对位置。
typedef struct{
int val;//用来存储非零元素的值
int i;//用来存储非零元素的相对位置
}Doubtype;
方法三:链式存储法(邻接表表示法和十字链表表示法)
**邻接表表示法:**将矩阵中的每一行非零元素使用链表表示。链表结点用两个元素分别表示:对应元素和元素的列号。
**十字链表表示法:**将稀疏矩阵中的,每一行用一个带头结点的链表表示,每一列也如此。链表结点用5个元素表示:行,列,值,向下结点的指针,向右结点的指针。