如何在Julia中使用cholfact()的就地版本



我需要求解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字段。

相关内容

  • 没有找到相关文章

最新更新