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

Geo*_*ris 7 performance linear-algebra julia qr-decomposition

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

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

该函数qrfact允许以打包格式存储因子分解.但是,我之后仍会写: F = qrfact(A); Q = F[:Q]; R = F[:R] 再次为Q和分配新数组R.最后,文档还建议了该qrfact!函数,它通过覆盖输入A来节省空间,而不是创建副本.但是,如果一个人使用F = qrfact!(A) 覆盖写入A是没有用的,因为它不是,Q或者R哪一个(具体来说,我)需要.

所以我的两个问题是:

  1. 如果您只关心矩阵Q并且R重新分配它们没有问题,那么执行QR分解的最佳/最有效方法是什么?

  2. A当一个人打电话时,矩阵中实际写的是什么qrfact!(A)

Fen*_*ang 5

F = qrfact!(A)
Run Code Online (Sandbox Code Playgroud)

或者

F = qrfact(A)
Run Code Online (Sandbox Code Playgroud)

F[:Q]并且F[:R]不分配新的密集数组;他们只是欣赏到压缩格式从QR是很容易计算。这意味着qrfact!(A)不需要为Qand分配数组R,它只是简单地为 计算打包格式A

但是,这也意味着F[:Q]F[:R] 不能突变。如果出于某种原因需要修改其中之一,则需要将collect其转换为 mutable Array,这肯定会分配。使用qrfact!(A)代替仍然会更有效qrfact(A),因为后者将为打包的 QR 分解以及collected分配空间Array