如何在 Julia 中最有效地使用 QR 分解?

How to most efficiently use QR-decomposition in Julia?

避免数组分配有利于提高性能。但是,我还没有理解什么是对矩阵 A 执行 QR 分解的最有效方法。 (注意:Q和R矩阵都需要)

简单地使用 Q, R = qr(A) 这可能不是最好的主意,因为它分配了 Q 和 R,两者都可以重新分配。

函数 qrfact 允许一个 store factorization in a packed format。不过,事后我还是会写: F = qrfact(A); Q = F[:Q]; R = F[:R] 再次为 QR 分配新数组。最后,文档还建议使用 qrfact! 函数,即 saves space by overwriting the input A, instead of creating a copy。但是,如果使用 F = qrfact!(A) 重写的 A 不是 有用的 ,因为它既不是 Q 也不是 R,哪个(具体来说,我)会需要。

所以我的两个问题是:

  1. 如果您只关心矩阵 QR 并且没有问题,那么执行 QR 分解的 best/most 有效方法是什么?分配它们。

  2. 调用qrfact!(A)时矩阵A实际写的是什么?

F = qrfact!(A)

F = qrfact(A)

F[:Q]F[:R]不分配新的密集数组;它们只是打包格式的简单视图,从中可以轻松计算出 QR。这意味着 qrfact!(A) 不需要为 QR 分配数组,它只是计算 A.

的压缩格式。

然而,这也意味着F[:Q]F[:R]不能突变。如果出于任何原因需要修改其中一个,则需要将其 collect 变为可变的 Array,这肯定会分配。使用 qrfact!(A) 而不是 qrfact(A) 仍然会更有效,因为后者将分配 space 用于压缩 QR 分解以及 collected [=23] =].