避免数组分配有利于提高性能。但是,我还没有理解什么是最有效的方法,可以执行矩阵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]
再次为Q
和R
分配新数组。最后,文档还建议了qrfact!
函数,saves space by overwriting the input A, instead of creating a copy。但是,如果使用F = qrfact!(A)
被覆盖的A
不是有用的,因为它不是Q
或R
,而是一个(特别是I)需要的。 / p>
所以我的两个问题是:
如果您只关心矩阵Q
和R
,那么执行QR分解的最佳/最有效方法是什么?您可以毫无问题地重新分配它们。
当一个人调用A
时,矩阵qrfact!(A)
中实际写了什么?
答案 0 :(得分:3)
在
F = qrfact!(A)
或
F = qrfact(A)
F[:Q]
和F[:R]
不分配新的密集数组;它们只是对容易计算Q
和R
的压缩格式的视图。这意味着qrfact!(A)
不需要为Q
和R
分配数组,它只是为A
计算打包格式。
但是,这也意味着F[:Q]
和F[:R]
无法变异。如果您因任何原因需要修改其中一个,则需要collect
将其变为可变Array
,这肯定会分配。使用qrfact!(A)
代替qrfact(A)
仍然更有效,因为后者将为打包的QR分解以及collect
ed Array
分配空间。< / p>