我有一个矩阵在哪里我想计算完整的 QR 分解. 在哪里是正交的矩阵。
Bishof & Van Loan (1987)描述了可以表示为低秩矩阵加上单位矩阵的和:
在哪里和. 我自己用 Python 实现了这个,它可以工作!但它仍然很慢,因为它涉及一个 for 循环列。我很好奇是否有人有已经实现这个的库的指针......如果没有,我可能会尝试在 Julia 中重新实现。
我有一个矩阵在哪里我想计算完整的 QR 分解. 在哪里是正交的矩阵。
Bishof & Van Loan (1987)描述了可以表示为低秩矩阵加上单位矩阵的和:
在哪里和. 我自己用 Python 实现了这个,它可以工作!但它仍然很慢,因为它涉及一个 for 循环列。我很好奇是否有人有已经实现这个的库的指针......如果没有,我可能会尝试在 Julia 中重新实现。
后来的一篇论文 Schrieber 和 Van Loan 1989 描述了一种“紧凑”的 WY 表示,它的存储效率更高,
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