7

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

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

该功能qrfact允许以打包格式存储分解。但是,之后我仍然会写: F = qrfact(A); Q = F[:Q]; R = F[:R] 再次为Qand分配新数组R。最后,文档还建议了该qrfact!函数,该函数通过覆盖输入 A 来节省空间,而不是创建一个副本。但是,如果一个人使用F = qrfact!(A) 了被覆盖的东西,在某种意义上说它不是orA是没有的,这是一个人(特别是我)需要的。QR

所以我的两个问题是:

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

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

4

1 回答 1

5

F = qrfact!(A)

或者

F = qrfact(A)

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

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

于 2017-05-28T17:17:14.683 回答