如何在 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]
再次为 Q
和 R
分配新数组。最后,文档还建议使用 qrfact!
函数,即 saves space by overwriting the input A, instead of creating a copy。但是,如果使用 F = qrfact!(A)
重写的 A
不是 有用的 ,因为它既不是 Q
也不是 R
,哪个(具体来说,我)会需要。
所以我的两个问题是:
如果您只关心矩阵 Q
和 R
并且没有问题,那么执行 QR 分解的 best/most 有效方法是什么?分配它们。
调用qrfact!(A)
时矩阵A
实际写的是什么?
在
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)
仍然会更有效,因为后者将分配 space 用于压缩 QR 分解以及 collect
ed [=23] =].
避免数组分配有利于提高性能。但是,我还没有理解什么是对矩阵 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
,哪个(具体来说,我)会需要。
所以我的两个问题是:
如果您只关心矩阵
Q
和R
并且没有问题,那么执行 QR 分解的 best/most 有效方法是什么?分配它们。调用
qrfact!(A)
时矩阵A
实际写的是什么?
在
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)
仍然会更有效,因为后者将分配 space 用于压缩 QR 分解以及 collect
ed [=23] =].