Eigen稀疏矩阵求解时速度慢,占用内存大

项目需要求解一个超大的稀疏矩阵方程组,本来是打算用opencv的Mat或者SparseMat去实现的。但是Mat是稠密矩阵,占用内存比较大;而SparseMat没有对应的求解函数。所以最后打算使用Eigen库实现这一需求。

Eigen库解方程组的官方文档如下,可以根据方程组自身的特点选择不同的求解算法:

https://eigen.tuxfamily.org/dox/group__TopicSparseSystems.html

看了之后决定使用LU分解的方法:SparseLU来求解方程组,官方文档所给的代码是:

VectorXd x(n), b(n);
SparseMatrix<double> A;
SparseLU<SparseMatrix<double>, COLAMDOrdering<int> >   solver;
// fill A and b;
// Compute the ordering permutation vector from the structural pattern of A
solver.analyzePattern(A); 
// Compute the numerical factorization 
solver.factorize(A); 
//Use the factors to solve the linear system 
x = solver.solve(b); 

问题就是使用了这个代码之后,在解算的时候非常慢,而且电脑内存占用一直在增加。直到半个多小时后,程序占用100%内存都还没有解出来。

之后仔细研究了一下SparseLU的参数,第二个参数COLAMDOrdering<int>是用于减少LU分解等方法时填充的元素。


   于是我尝试把第二个参数改成AMDOrdering

Eigen::SparseLU<Eigen::SparseMatrix<double>, Eigen::AMDOrdering<int>> solver;

成功秒解方程组!原理不太理解,可能是我的方程组自身更加适合AMDOrdering的排序方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值