我需要求解Ax=b,其中A是对称正定矩阵。这可以使用cholesky分解来有效地实现。因为矩阵A的尺寸至少为25000 x 25000,所以我不能浪费内存。因此,我想使用Julia巧克力的原位版本:
cholfact!(A, :U, pivot = true)
与相比
F = cholfact(A, :U, pivot = true)
这将节省千兆字节的内存。
然而,在计算之后,A
是类型Matrix Float64
,而F
具有类型CholeskyPivoted{Float64}
。据我所知,就地版本会丢失基本信息,例如枢轴向量F.piv
。如何在不浪费内存的情况下正确计算cholesky分解?
您想要将这两者结合起来:
F = cholfact!(A, :U, pivot = true)
这将返回一个CholeskyPivoted
,这确实是您想要的。但是使用cholfact!
,就是说你不在乎A
在这个过程中是否被破坏。因此,它将使用为A
分配的存储器来存储因子分解(从而破坏A
)。
之后,您应该只使用F
,而不是A
,因为A
已被销毁。在内部,F
将包含对A
的引用,因为它将因子分解存储在A
中。如果您研究一下CholeskyPivoted
是如何表示的,这一点可能会更清楚;CCD_ 18将用于该CCD_ 19字段。