我需要解决 A x = b,其中 A 是对称的正半确定矩阵。这可以使用cholesky分解有效地实现。因为矩阵 A 至少具有25000 x 25000的尺寸,所以我不能浪费内存。因此,我想使用Julia's cholfact的原位版本:
cholfact!(A, :U, pivot = true)
与
相比F = cholfact(A, :U, pivot = true)
这将节省千兆字节的内存。
但在计算之后,A
的类型为Matrix Float64
,而F
的类型为CholeskyPivoted{Float64}
。据我所知,就地版本丢失了基本信息,例如数据透视矢量F.piv
。如何在不浪费内存的情况下正确计算cholesky分解?
答案 0 :(得分:2)
您希望将这两者结合起来:
F = cholfact!(A, :U, pivot = true)
这会返回CholeskyPivoted
,这确实是你想要的。但是,通过使用cholfact!
,您说您不关心A
是否在此过程中被销毁。因此,它将使用为A
分配的内存来存储分解(从而销毁A
)。
之后,您应该只使用F
,而不是A
,因为A
已被销毁。在内部,F
将包含对A
的引用,因为它将分解存储在A
中。如果你研究CholeskyPivoted
is represented的方式,这可能会更清楚; A
字段将用于UL
字段。