我想计算一个非常大的矩阵(5e6 X 5e6)的对数行列式。然而,它是高度稀疏的-每行上只有6个非零条目(7个计算对角线)。它也是对称的和正定的。
在Eigen中,我尝试使用Cholesky分解:SimplicialLDLT<SparseMatrix<double>>
,然后对对角线的对数值求和(可通过SimplicialLDLT::vectorD()
访问),但分解运行了很长一段时间,没有完成。有更好的方法吗?我实际上不需要任何类型的分解,只需要对数行列式本身(或者一个很好的估计)。
发布于 2016-07-18 13:52:55
你希望有多快?你可以尝试3.3-beta1版本中的所有稀疏解算器,找出哪个更快。
https://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html
发布于 2016-07-19 11:59:25
我可能会把这个作为一个答案,这样我就可以展示一个数字。
首先, Eigen的documentation on sparse solvers说SimplicialLDLT
是“非常稀疏和不太大的问题的推荐”。你的问题很少,但也很大。
其次, 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
矩阵的对角线上有很多正好为零的条目,因此整个稀疏矩阵的行列式是零到双精度,对数或无对数。
https://stackoverflow.com/questions/38427092
复制相似问题