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

时间:2017-05-28 10:12:20

标签: performance julia linear-algebra qr-decomposition

避免数组分配有利于提高性能。但是,我还没有理解什么是最有效的方法,可以执行矩阵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不是有用的,因为它不是QR,而是一个(特别是I)需要的。 / p>

所以我的两个问题是:

  1. 如果您只关心矩阵QR,那么执行QR分解的最佳/最有效方法是什么?您可以毫无问题地重新分配它们。

  2. 当一个人调用A时,矩阵qrfact!(A)中实际写了什么?

1 个答案:

答案 0 :(得分:3)

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)仍然更有效,因为后者将为打包的QR分解以及collect ed Array分配空间。< / p>