【发布时间】:2016-11-20 11:49:37
【问题描述】:
我想计算一个非常大的矩阵 (5e6 x 5e6) 的对数行列式。然而,它是高度稀疏的——每行只有 6 个非零条目(计算对角线的有 7 个)。它也是对称正定的。
在 Eigen 中,我尝试使用 Cholesky 分解:SimplicialLDLT<SparseMatrix<double>>,然后对对角线的对数值求和(SimplicialLDLT::vectorD() 可访问)但是分解运行了很长时间而没有完成。有更好的方法吗?我实际上不需要任何类型的分解,只需要对数行列式本身(或一个好的估计)。
【问题讨论】:
-
对于这样的矩阵,SimplicialLDLT 应该非常快,大约为 1-2 秒。确保在编译器优化开启的情况下进行编译,并且正确填充了矩阵。
-
你能确定你没有点击交换吗?我问是因为,在研究算法之前,也许出于某种原因,Eigen 试图密集填充一个巨大的矩阵?
-
另外,非零条目的大小按什么顺序排列?我正在尝试创建一个类似的数组进行测试,但我不确定是否应该用统一随机数据或正常随机数据或其他填充非零条目。
-
所以一般来说,对称矩阵的 LU 分解会沿着 L 或 U 的对角线有正负元素。你是否注意,当你记录负数时,你要么保持绝对值吗?还是使用具有复杂功能的日志来返回一个复数,然后再求和?
-
@AhmedFasih 所有非零项非对角线均为-1。在对角线上,它们是 1-5 之间的小值。也许你是对的,它试图让它变得稠密,但我不知道该怎么说。
标签: linear-algebra sparse-matrix eigen