稀疏矩阵相关 1
2014-02-25 07:53
176 查看
应用: PDE数值解。
稀疏矩阵与图论:
1 邻接图可用一个稀疏矩阵描述。其中稀疏矩阵的每个非零元素(对应一个未知变量)表示“图”中对应的两个“节点”之间有一条“边”; 对称稀疏矩阵表示一个无向图。高斯消元法所选的pivots,就是“图”中独立的”节点“ ( 该节点与其他节点之间不存在”边“)。
2 PDE离散网格中节点自由度的编号。法一,一个节点的所有自由度连续的编号;法二:所有节点的相同自由度连续编号。计算网格 - quotient graph
3 矩阵初等变换与重排。
3.1 初等变换: 矩阵M中两行交换,变换矩阵左乘M。变换矩阵即单位对角矩阵中对应两行互换位置;M中两列交换,变换矩阵右乘M。如果采用相同的变换矩阵,行变换与列变 换的结果矩阵相似。
初等变换的意义是:矩阵未知量重编号。对应即”图中节点”重新编号。
| a11 0 a13 0 | | a11 a13 0 0 |
| 0 a22 a23 a24 | ------> | a31 a33 a32 0 |
| a31 a32 a33 0 | | 0 a23 a22 a24 |
| 0 a42 0 a44 | | 0 0 a42 a44 |
实际稀疏矩阵的初等变换,一般都采用”对称变换”。即行变换与对应列变换都执行。 A = PAP^T。 对称变换等价于将图中的节点进行重编号,但不改变边的关系。即原来 old(i) old(j)之间有一条边,这条“边”在新节点 i, j对之间仍然存在。应用举例:
对一个满秩矩阵M,其第一行/第一列元素均非零,其余位置只有对角线有元素,进行高斯消元。由于消元步从第一行开始,将导致每步在原来零元素的位置,填充非零元素。对于大型稀疏矩阵,该行为非常不合适。而对此矩阵进行初等行列变换,交换第一行/第一列 与 最后一行/最后一列。此时消元将不再产生”非零填充“。
3.2 非零元素编号/排序
最简单的办法采用广度优先搜索(BFS):采用某个顺序(任意的)开始访问节点,每个当前访问节点的邻接点若还没有编号,就给个编号并且将其定义为下一层将要访问的节点。BFS中会有两个选择影响最后的变换矩阵。一,第一个访问节点怎么选;二,在同一层的节点访问顺序怎么定。Cuthill - MeKee 算法给出了如下办法:
1 第一个访问点的选定,是问题空间相关的,即根据离散网格选定。最终将影响矩阵的带宽。比如,有限元方法里面,单元节点编号尽量满足相近的节点编号尽可能接近。第一个访问点尽量是与其他节点连线最少的那个。
2 同一层内节点按从小到大的顺序访问。
3.3 独立集排序(independent set ordering)
计算域离散后,经常得到一种如下形式的矩阵。 A = (D, E;F, C),其中D是一个对角子矩阵,C, E,F为稀疏子矩阵。D对应未知变量是完全解耦的,非常便于计算,所以希望通过矩阵变换,得到最大秩的D。而实际上确定某个矩阵最大的D是个NPH问题,故可以尝试一些启发式算法:
每步访问到一个节点,就将该节点以及它所有的邻节点都从图中剔除,然后继续访问剩下的节点,直到剔除所有图中节点。
3.4 不可约矩阵
如果矩阵对应的图是全联通的(图中所有节点之间都可以通过若干条边连接),那么该矩阵就是不可约的。如果矩阵可约,就可以通过”对称变换“,将其化作块上三角矩阵。不可约矩阵,貌似是”全填充“的矩阵。
4 稀疏矩阵存储
最简单的是三元组:一列存元素值,一列存元素横坐标,一列存元素列坐标。经典的压缩存储法 (Compressed Sparse Row/Column)。对于”带状“矩阵,可以按对角元存储等等。
5 稀疏矩阵基本运算
5.1 矩阵 向量 乘法
% 本周介绍稀疏矩阵的迭代解法
稀疏矩阵与图论:
1 邻接图可用一个稀疏矩阵描述。其中稀疏矩阵的每个非零元素(对应一个未知变量)表示“图”中对应的两个“节点”之间有一条“边”; 对称稀疏矩阵表示一个无向图。高斯消元法所选的pivots,就是“图”中独立的”节点“ ( 该节点与其他节点之间不存在”边“)。
2 PDE离散网格中节点自由度的编号。法一,一个节点的所有自由度连续的编号;法二:所有节点的相同自由度连续编号。计算网格 - quotient graph
3 矩阵初等变换与重排。
3.1 初等变换: 矩阵M中两行交换,变换矩阵左乘M。变换矩阵即单位对角矩阵中对应两行互换位置;M中两列交换,变换矩阵右乘M。如果采用相同的变换矩阵,行变换与列变 换的结果矩阵相似。
初等变换的意义是:矩阵未知量重编号。对应即”图中节点”重新编号。
| a11 0 a13 0 | | a11 a13 0 0 |
| 0 a22 a23 a24 | ------> | a31 a33 a32 0 |
| a31 a32 a33 0 | | 0 a23 a22 a24 |
| 0 a42 0 a44 | | 0 0 a42 a44 |
实际稀疏矩阵的初等变换,一般都采用”对称变换”。即行变换与对应列变换都执行。 A = PAP^T。 对称变换等价于将图中的节点进行重编号,但不改变边的关系。即原来 old(i) old(j)之间有一条边,这条“边”在新节点 i, j对之间仍然存在。应用举例:
对一个满秩矩阵M,其第一行/第一列元素均非零,其余位置只有对角线有元素,进行高斯消元。由于消元步从第一行开始,将导致每步在原来零元素的位置,填充非零元素。对于大型稀疏矩阵,该行为非常不合适。而对此矩阵进行初等行列变换,交换第一行/第一列 与 最后一行/最后一列。此时消元将不再产生”非零填充“。
3.2 非零元素编号/排序
最简单的办法采用广度优先搜索(BFS):采用某个顺序(任意的)开始访问节点,每个当前访问节点的邻接点若还没有编号,就给个编号并且将其定义为下一层将要访问的节点。BFS中会有两个选择影响最后的变换矩阵。一,第一个访问节点怎么选;二,在同一层的节点访问顺序怎么定。Cuthill - MeKee 算法给出了如下办法:
1 第一个访问点的选定,是问题空间相关的,即根据离散网格选定。最终将影响矩阵的带宽。比如,有限元方法里面,单元节点编号尽量满足相近的节点编号尽可能接近。第一个访问点尽量是与其他节点连线最少的那个。
2 同一层内节点按从小到大的顺序访问。
3.3 独立集排序(independent set ordering)
计算域离散后,经常得到一种如下形式的矩阵。 A = (D, E;F, C),其中D是一个对角子矩阵,C, E,F为稀疏子矩阵。D对应未知变量是完全解耦的,非常便于计算,所以希望通过矩阵变换,得到最大秩的D。而实际上确定某个矩阵最大的D是个NPH问题,故可以尝试一些启发式算法:
每步访问到一个节点,就将该节点以及它所有的邻节点都从图中剔除,然后继续访问剩下的节点,直到剔除所有图中节点。
3.4 不可约矩阵
如果矩阵对应的图是全联通的(图中所有节点之间都可以通过若干条边连接),那么该矩阵就是不可约的。如果矩阵可约,就可以通过”对称变换“,将其化作块上三角矩阵。不可约矩阵,貌似是”全填充“的矩阵。
4 稀疏矩阵存储
最简单的是三元组:一列存元素值,一列存元素横坐标,一列存元素列坐标。经典的压缩存储法 (Compressed Sparse Row/Column)。对于”带状“矩阵,可以按对角元存储等等。
5 稀疏矩阵基本运算
5.1 矩阵 向量 乘法
do i = 1, N K1 = IA(i) K2 = IA(i+1) - 1 y(i) = dotproduct( A(k1:k2), x(ja(k1:k2)) end % CSR 存储该运算每步计算一个结果值y(i), 步与步之间独立,适合并行。
% 本周介绍稀疏矩阵的迭代解法
相关文章推荐
- 选择矩阵(选择矩阵是稀疏的)相关计算
- 稀疏矩阵的相关操作(存储、转置、快速转置、相加)
- 数据结构(四)---稀疏矩阵转三元组的相关操作
- 稀疏矩阵的数据结构及相关算法
- 基于稀疏矩阵数据结构的相关人物搜索
- C/C++ 第八周串和数组 (一)稀疏矩阵的三元组表示的实现及应用 项目4—(1)
- 矩阵的压缩存储(稀疏矩阵的十字链表存储、稀疏矩阵的三元组行逻辑链接的顺序表存储表示、稀疏矩阵的三元组顺序表存储表示)
- 体验显卡计算--稀疏矩阵求解调用CUBLAS实测
- 一步一步复习数据结构和算法基础-稀疏矩阵基本操作
- 用十字链表存储 稀疏矩阵乘法
- MATLAB笔记 sparse稀疏矩阵函数
- 第9周SHH数据结构-【项目3-稀疏矩阵的三元组表示的实现及应用(1)】
- 第九周项目3 稀疏矩阵的三元组表示的实现1
- 用sparselib库解稀疏矩阵线性方程组
- 序列列表与稀疏矩阵的转换
- Python 稀疏矩阵-sparse 存储和转换
- 转载:Intel MKL 稀疏矩阵求解PARDISO 函数
- 稀疏矩阵的十字链表存储
- 压缩感知进阶——有关稀疏矩阵
- 【Matlab】sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)