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

4

我需要解决 Ax = b 的问题,其中 A 是一个对称半正定矩阵。这可以通过使用 Cholesky 分解来高效实现。由于矩阵 A 至少具有 25000 x 25000 的维度,因此我不能浪费内存。因此,我想使用 Julia 的 cholfact 的原地版本:

cholfact!(A, :U, pivot = true)

与之相比,

F = cholfact(A, :U, pivot = true)

这样可以节省几个G字节的内存。

然而,在计算之后,A 的类型为 Matrix Float64,而 F 的类型为 CholeskyPivoted{Float64}。据我所知,原地版本会失去重要信息,例如枢轴向量 F.piv。那么如何在不浪费内存的情况下正确计算Cholesky分解?

1个回答

2

您希望将这两个内容结合在一起:

F = cholfact!(A, :U, pivot = true)

这将返回一个CholeskyPivoted,这确实是你想要的。但是使用cholfact!,你正在表明你不在乎A是否在过程中被破坏。因此,它将使用为A分配的内存来存储因式分解(从而破坏A)。
之后,您应该只使用F,而不是A,因为A已经被破坏了。在内部,F将包含对A的引用,因为它正在A中存储因式分解。如果您检查CholeskyPivoted的表示方式,这可能会更清晰;A将用于该UL字段。

为什么这对我不起作用? 错误:无法识别的关键字参数“pivot” 在linalg/cholesky.jl的cholfact!中。 - Lindon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接