首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特征直接计算大型稀疏矩阵的对数行列式

特征直接计算大型稀疏矩阵的对数行列式
EN

Stack Overflow用户
提问于 2016-07-18 08:06:59
回答 2查看 912关注 0票数 1

我想计算一个非常大的矩阵(5e6 X 5e6)的对数行列式。然而,它是高度稀疏的-每行上只有6个非零条目(7个计算对角线)。它也是对称的和正定的。

在Eigen中,我尝试使用Cholesky分解:SimplicialLDLT<SparseMatrix<double>>,然后对对角线的对数值求和(可通过SimplicialLDLT::vectorD()访问),但分解运行了很长一段时间,没有完成。有更好的方法吗?我实际上不需要任何类型的分解,只需要对数行列式本身(或者一个很好的估计)。

EN

回答 2

Stack Overflow用户

发布于 2016-07-18 13:52:55

你希望有多快?你可以尝试3.3-beta1版本中的所有稀疏解算器,找出哪个更快。

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

票数 0
EN

Stack Overflow用户

发布于 2016-07-19 11:59:25

我可能会把这个作为一个答案,这样我就可以展示一个数字。

首先, Eigen的documentation on sparse solversSimplicialLDLT是“非常稀疏和不太大的问题的推荐”。你的问题很少,但也很大。

其次, SimplicialLDLT需要的输入不仅是对称的(“自伴随”),而且是正定的,而你的输入几乎肯定不是这样的(除非你有理由不这么认为?)。

SimplicialLDLT可能花费了大量的时间来计算乔列斯基分解--它不会成功地找到它,因为你的矩阵不是正定的。

这就引出了的第三个点。Matlab的LDLT的等价物是ldl,奇怪的是它不需要正定矩阵,所以它在几秒钟内就处理完了我的1e4乘1e4的例子(生成稀疏矩阵比分解成LDL需要更长的时间)。

下面是下三角因子的稀疏模式(通过Matlab中的spy(L) ):

它有1e7个非零元素,占用162MB内存。回想一下,这是针对1e4x1e4的问题。如果内存使用量与矩阵的长度(1e4RAM,5e6)呈线性关系,那么您将看到将近80 GB的→使用量。相反,如果它随着元素的数量(1e4^2RAM5e6^2)而扩展,那么您将需要38TBRAM…所有这些分析都不是决定性的-很可能是5e6到5e6的比例极大地增加了LDL因素的稀疏性,但这可能解释了为什么Eigen被挂起。正如注释中所提到的,检查交换文件是否在颠簸。

fourth的一个问题是,对于我的测试示例1e4 x 1e4,我在下三角L矩阵的对角线上有很多正好为零的条目,因此整个稀疏矩阵的行列式是零到双精度,对数或无对数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38427092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档