QR分解的“WY”表示 - 实现?

计算科学 矩阵分解
2021-12-07 07:53:43

我有一个矩阵ARm×n在哪里mn我想计算完整的 QR 分解A=QR. 在哪里Q是正交的m×m矩阵。

Bishof & Van Loan (1987)描述了Q可以表示为低秩矩阵加上单位矩阵的和:

Q=I+WY

在哪里WRm×nYRn×m. 我自己用 Python 实现了这个,它可以工作!但它仍然很慢,因为它涉及一个 for 循环n列。我很好奇是否有人有已经实现这个的库的指针......如果没有,我可能会尝试在 Julia 中重新实现。

2个回答

后来的一篇论文 Schrieber 和 Van Loan 1989 描述了一种“紧凑”的 WY 表示,它的存储效率更高,

Q=IYTYT
在哪里T是上三角形。Elmroth 和 Gustavson 2000 的论文随后使用这种紧凑的 WY 表示推导出递归 QR 算法,该算法非常优雅和高效,因为它基于 Level-3 BLAS 操作。

Elmroth 和 Gustavson 2000 算法的 AC 实现在 GSL 库中:这里

LAPACK 在DGEQRT3例程中提供了 Elmroth 和 Gustavson 的 fortran 实现。标准 LAPACK QR 例程 ( DGEQRF ) 也使用 WY 方法,排名揭示 QR 算法也是如此(技术说明here)。然而,这些(非递归)算法要复杂得多,而且不那么优雅。

施赖伯、罗伯特和查尔斯范贷款。“Householder 转换产品的高效存储 WY 表示。” SIAM 科学和统计计算杂志 10.1 (1989): 53-57。

Elmroth, E. 和 Gustavson, FG, 2000。将递归应用于串行和并行 QR 分解可以提高性能。IBM 研发杂志,44(4),pp.605-624。

只是建立在@vibe 的答案之上。这是一个关于如何访问和使用 LAPACK 以使用 Python/scipy 执行此操作的快速草图。这在引擎盖下使用了 Elmroth & Gustavson 算法。

from scipy.linalg.lapack import dgeqrt

def tall_qr(A):
    m, n = A.shape
    assert m > n
    V, T, INFO = dgeqrt(n, A)

    # Extract R from V.
    R = np.zeros_like(V)
    R[np.triu_indices_from(R)] = V[np.triu_indices_from(V)]

    # Extract elementary reflectors in V.
    V[np.arange(n), np.arange(n)] = 1.0
    V[np.triu_indices_from(V, 1)] = 0.0

    # To recover the dense orthogonal matrix use:
    #   Q = np.eye(m) - V @ T @ V.T
    #
    # However, the dense matrix multiply (Q @ B) should be
    # slower than B - (V @ T) @ (V.T @ B) for large matrices.

    return (V, T), R