[概要]
圧縮記憶マトリックスは、主に特定のスパース行列に目的としています。
- 特別行列:同じ値と一定の法則の分布の多くの行列要素。
- 疎行列:マトリックス多くのゼロ要素があります。
圧縮の基本的な考え方は保存されます。
- 同じ要素のための複数の値は、一つのメモリ領域を割り当てます。
- ゼロ要素は、ストレージスペースを割り当てません。
[圧縮]マトリックス
1.対称行列
対称行列特性:[I] [J] = [J] [i]は、それだけ下三角行列部に格納することができます。
下三角行列N *(N + 1)/ 2個の要素があり、行の要素が配列SA内に格納することができる[N *(N + 1)/ 2]で
その後、数1 + 2 + ... + I-1 + jを、すなわちあるi番目の行のj番目の要素の対称行列のための:i *が(I-1)/ 2 + J
0から一次元配列インデックスが開始されると、一次元アレイれるインデックスのでK = Iは、(i + 1 * )/ 2 + J-1を
三角形要素の[J] [I]、[I] [j]は=ので [j]を[i]は、 アクセスを[I] [j]を下三角要素に対応する、すなわち、 :K = J * / 2 + 1-I(1-I)。
2.三角行列
三角行列を上三角行列と下三角行列に分割されます。
- 上三角行列:主対角線以下は、すべての定数cであります
- 三角行列を下げる:主対角線上のすべては、定数cであります
1)下三角行列
対称行列下三角行列を格納する同じ定数ので、その専用記憶素子の他の下部外側の三角形だけでなく、対角線上に格納された定数を除いて、同様であるため、保管することができるので、(総記憶そのN * N + 1)/ 2 + 1の要素、これらの要素は、の配列SA [N *(N + 1)/ 2 + 1]に行によって格納されてもよいです。
アレイ、Jの対応関係における添え字K SA Iを有する素子Aのいずれか[i] [j]の三角行列を下げます。
- I> = J:K =私は、(i-1)/ 2 + J-1 *
- I <J:K = N *(N + 1)/ 2
2)上三角行列
記憶装置は、マトリックスに似て上三角行列を三角下げます。
アレイ、Jの対応関係における添え字K SA Iを有する要素A [i] [j]のいずれかの上三角行列。
- I <= J:K =(I-1)×(2N-I + 2)/ 2 + JI
- I> J:K = N *(N + 1)/ 2
3.対角行列
对角矩阵,即除主对角线和它的上下方若干条对角线的元素外,所有其他元素都为零。
其压缩存储的方式有两种:一维数组压缩、二维数组压缩
1)一维数组压缩
对于 w 对角矩阵,其第 i 行第 j 列的元素序号为前 i-1 行元素个数+第 i 行元素个数,即:w+3*(i-w)+(j-i+w) = 2i+j-w
由于一维数组下标从 0 开始,那么元素 a[i][j] 在数组中的下标 k=2i+j-w-1
2)二维数组压缩
如上图,对于对角矩阵,可将其转为二维数组存储。
对于一个 n*m 的 w 对角矩阵,可将其压缩到 m 行 w 列的二维数组中,a[i][j] 映射为 b[t][s],其映射关系为:
- t=i
- s=j-i+2
【稀疏矩阵】
1.三元组
将稀疏矩阵的非零元素对应的三元组所构成的集合,按行优先的顺序排列成线性表,则稀疏矩阵的压缩存储转化为三元组表的存储。
template<class T>
struct Element{
int row,col;
T item;
};
2.三元顺序表
采用顺序存储结构存储的三元组表即为三元顺序表,但要表示一个稀疏矩阵,还要在存储三元组表时存储矩阵的行数、列数、非零元素个数。
const int N=100;
template<class T>
struct sparseMatrix{
Element data[N];
int row,col,num;
};
3.十字链表
采用链式存储结构存储的三元组表即为十字链表,其具备链接存储的特点,其对矩阵运算操作较三元顺序表要方便许多。
十字链表存储稀疏矩阵的基本思想是:将每个非零元素对应的三元组存储为一个链表结点,结点由 5 个域组成,element 为数据域,存储非零元素对应的三元组,right、down 为指针域,分别指向同一行、同一列中的下一个三元组
template<class T>
class olNode{
public:
int row,col;
T element;
olNode<T>* right,*down;
public:
olNode(){right=NULL;down=NULL;};
};