栈:矩阵的压缩存储

xiaoxiao2021-02-28  104

概念:

科学与工程计算有一个特殊的数学对象,那就是矩阵。如何将矩阵中的各个元素存储在计算机中,数组就是一个很好的选择。我们通常会遇到三种类型的矩阵:

普通矩阵特殊矩阵:对称矩阵、上三角矩阵、下三角矩阵、对角矩阵等稀疏矩阵

特殊

特殊矩阵和稀疏矩阵压缩存储的目的是节省存储空间。矩阵的下标是从1开始,而将改矩阵压缩成内存中的一维空间时,与该一维空间所对应的数组下标是从0开始。

1. 对称矩阵:

a11a21a31ai1a12a22a32ai2a13a23a33ai3a1ja2ja3jaij

性质:

在n阶矩阵A中的元素满足 : aij = aji ( 1≤ i , j≤n );压缩策略:只存储上三角或下三角的元素。所需空间 n(n+1)2 一维数组sa[ n(n+1)2 ] 存储以行序为主序的下三角(包括对角线),其地址的运算,即 aij 和sa[k] 之间存在如下对应关系: k=i(i1)2+j1,j(j1)2+i1,i ≥ j线i < j

2. 上三角与下三角矩阵:

上三角矩阵: a11mmma12a22mma13a23a33ma1ja2ja3jaij

下三角矩阵: a11a21a31ai1ma22a32ai2mma33ai3mmmaij

3. 对称矩阵:

a11a210000a12a22a320000a23a33a430000a34a44a540000a45a55a650000a56a66

4. 稀疏矩阵:

00300151200018090024000000070000000014000000000

性质:

稀疏矩阵:零元素个数远远大于非零元素的个数。稀疏因子:在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个域分别保存所在行下一个元素和所在列下一个元素。 最后将行链表的头指针组成一个数组,将列链表的头指针组成另一个数组,这样就形成了一个十字交叉的链表。
转载请注明原文地址: https://www.6miu.com/read-75456.html

最新回复(0)