LAPACK使用的原因是什么ττ在 QR 分解中(而不是对反射向量进行归一化)?

计算科学 线性代数 矩阵 拉帕克
2021-12-13 04:05:05

LAPACK 的 QR 例程将 Q 存储为 Householder 反射器。它缩放反射向量v1/v1,所以结果的第一个元素变为1,因此不必存储。它存储了一个单独的τ向量,其中包含所需的比例因子。所以反射矩阵是这样的:

H=IτvvT,

在哪里v未归一化。而在教科书中,反射矩阵是

H=I2vvT,

在哪里v被归一化。

为什么 LAPACK 可以扩展v1/v1,而不是对其进行规范化?

所需的存储是相同的(而不是τ,v1必须存储),然后,应用H可以更快地完成,因为不需要乘以τ(乘以2在教科书版本可以优化,如果不是简单的归一化,v被缩放2/v)。

(我的问题的原因是我正在编写一个QR和SVD例程,我想知道这个决定的原因,我是否需要遵循它)

3个回答

推动这种设计的是 Householder-QR 的受阻变体。如果您查看 Golub 和 Van Loan 的书(第 5.2 章左右),他们讨论了如何通过将单个反射器累积到形式为,其中的“高瘦”矩阵这个算法做更多的工作,但在实践中更快,因为它有丰富的 gemm() 调用。不幸的是,由于需要独立地表示 ,它在存储上是浪费的。I+WYTWYn×kWY

在后来的一篇论文中(引用如下),Van Loan 描述了一种更有效的“对称”数据结构,一种形式为的块反射器。这里仍然是,一个小的上三角矩阵,已经消除了的触发器/存储要求。虽然乘以的需要引入了少量的额外工作,但它通常是净收益,因为I+YTYTYn×kWTk×kTk<<n

在 LAPACK 中,非分块算法实际上只是分块算法的限制情况,一直到符号的选择(这将我们引向的一个小版本三角形)。k1τ1×1T

引文:Schreiber、Robert 和 Charles Van Loan。“Householder 转换产品的高效存储 WY 表示。” SIAM 科学和统计计算杂志 10.1 (1989): 53-57。

您不必存储,您可以从向量的其余部分重新计算它。(您也可以在标准化版本中从其他条目重新计算,但由于这些减法,它显然是一个不稳定的计算。)τv1

的下三角部分来存储,以便完全就地计算分解。Lapack 非常关心这些就地版本的算法。Rv2,...vn

我的建议基于英特尔 MKL 的文档https://software.intel.com/en-us/mkl-developer-reference-c-geqrf它看起来像输出存储 R 的对角线之上和之上的值,因此 Q 只剩下下三角形。使用额外的存储来存储缩放因子似乎很自然。