【Eigen】Chapter3 稀疏线性代数 Sparse Linear Algebra

(1)稀疏矩阵操作

​ 1)稀疏矩阵格式

​ 在许多应用中,矩阵其只有少量非零系数,这样的矩阵称为稀疏矩阵(Sparse Matrix)。在这种情况下,采用稀疏矩阵的存储方式,即仅存储非零系数,可以减少内存消耗并提高性能。

​ 在Eigen中,SparseMatrix<>模板类是用于表示稀疏矩阵,注意稠密的用的是Matrix<>,SparseMatrix<>提供了高性能和低内存使用率。它实现了广泛使用的压缩列(或行)存储方案的更通用的变体。

​ 它由四个紧凑数组组成:

​ 1 Values: 存储非零的系数值。注意,压缩列存储按照一列一列的顺序存储非零元素,同样,压缩行按照一行一行的顺序存储元素;

​ 2 InnerIndices: 存储非零的行(或列)下标。简单的说,我们可以先按照列或者行的顺序存储values,然后对于values中的每一个元素,确定其所在的行or列的下标;

​ 3 OuterStarts: 为每列(分别为行)存储前两个数组中第一个非零的索引。注意,这个数组存储的Values和InnerIndices中的位置;

​ 4 InnerNNZs:存储每列(分别为行)的非零元素个数。

​ 注意:术语inner指的是内部向量,该向量是列主矩阵的列,或行主矩阵的行。术语outer是指另一个方向,即行or列;

​ 在一个示例中可以更好地解释此存储方案。以下矩阵

// 0	3	0	0	0
// 22	0	0	0	17
// 7	5	0	1	0
// 0	0	0	0	0
// 0	0	14	0	8

​ and one of its possible sparse, column major representation:

Values: 		22	7	_	3	5	14	_	_	1	_	17	8
InnerIndices: 	1	2	_	0	2	4	_	_	2	_	1	4 
OuterStarts:	0	3	5	8	10	12
InnerNNZs: 		2	2	1	1	2

​ 注释:OutStarts表示的每一列中的起始非零元素在Values or InnerIndices中的索引,例如,第一列非零元素22在Values中的第0索引,第二列中的3在Values中的第3索引,第三列中的14在Values中的第5索引…

​ OutStarts多了一个元素,比如上述方阵有5列,那么应该只有5个元素,但是它有6个元素,难道是存储了最后一个元素?

​ 2)第一个例子

​ 在描述每个类之前,让我们从以下典型示例开始:

Δu=0\Delta u = 0Δu=0使用有限差分方案和Dirichlet边界条件在规则2D网格上求解拉普拉斯方程。这样的问题可以在数学上表示为Ax = b形式的线性问题,其中x是一个m维向量,在本例中,它表示像素值, b是从边界条件中获得,并且A是一个mXm的方阵,它是从离散化的拉普拉斯算子中获得的稀疏矩阵,即,只含有少数的非0元素。

​ (说实话,有点复杂)

#include <Eigen/Sparse>
#include <vector>
#include <iostream>
 
typedef Eigen::SparseMatrix<double> SpMat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值