【问题标题】:How to most efficiently use QR-decomposition in Julia?如何在 Julia 中最有效地使用 QR 分解?
【发布时间】:2017-05-29 01:17:14
【问题描述】:

避免数组分配有利于性能。但是,我还没有理解对矩阵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,这是一个人(特别是我)需要的。

所以我的两个问题是:

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

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

【问题讨论】:

  • 事后为什么需要Q = F[:Q]; R = F[:R]?你不能直接使用F[:Q]吗?
  • Julia 文档中有对存储方法的引用。具体来说,这个paper 被链接到。但事实上,你会想看看这个julia code
  • @MichaelK.Borregaard 使用QF[:Q] 对我来说并不重要。问题是如何避免从F[:Q] 完成分配(如果有的话)。
  • 哦该死,不幸的是我需要对F[:Q] 矩阵进行操作,因为我需要更改某些列上的符号(qr-decomposition 以查找 lyapunov 指数)
  • 我有一些 严重 怀疑分配数组的成本(实际上是 O(1))在涉及执行 O(n^3) 的算法中甚至可以检测到QR分解。您是否分析了您的代码并确认您确实需要避免这些分配?

标签: performance julia linear-algebra qr-decomposition


【解决方案1】:

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 分解以及collected Array 分配空间。

【讨论】:

  • 感谢您的回答。环顾四周后,我也得出了同样的结论(F[:Q] 没有分配)。我也了解qrfact!(A)A 的作用:它与R 具有相同的元素,但它不是上三角,所以我不知道下三角是怎么回事。 P.s.:不,我还没有发现这是我的代码很慢的原因。这只是让我更好地了解如何将qr 与 Julia 一起使用的机会。
  • 我们用来存储 QR 分解的格式在 netlib.org/lapack/explore-html/dd/d9a/… 中描述,所以基本上,Q 存储在下三角和额外的 T 矩阵中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多