データ構造とアルゴリズム - 圧縮されたメモリマトリックス

[概要]

圧縮記憶マトリックスは、主に特定のスパース行列に目的としています。

  • 特別行列:同じ値と一定の法則の分布の多くの行列要素。
  • 疎行列:マトリックス多くのゼロ要素があります。

圧縮の基本的な考え方は保存されます。

  • 同じ要素のための複数の値は、一つのメモリ領域を割り当てます。
  • ゼロ要素は、ストレージスペースを割り当てません。 

[圧縮]マトリックス

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;};
};

 

 

 

发布了1871 篇原创文章 · 获赞 702 · 访问量 194万+

おすすめ

転載: blog.csdn.net/u011815404/article/details/89326064