0 写在前面
关于 QR 分解的背景知识介绍,参见:GSL 系列 6 — 线性代数 1 — 背景知识 1
(QR 分解) 节,本篇只说明相关函数
若无特别说明,本篇代码均来自头文件 gsl_linalg.h
1 QR 分解相关函数
1.1 QR 分解
A = Q R A=QR A=QR
Householder 版:
将 A 分解为 Q R, Q 分别存储在矩阵 A 的下三角部分 ( v v v) 和向量 tau ( τ \tau τ) 中,R 存储在矩阵 A 的上三角部分(含对角)
推荐此方法用于中小型矩阵,或用于 M < N M<N M<N 时
int gsl_linalg_QR_decomp (gsl_matrix * A, gsl_vector * tau);
递归版 (带 _r
):
将 A 分解为 Q R, Q 分别存储在矩阵 A 的下三角部分 ( V V V) 和矩阵 T ( T T T) 中,R 存储在矩阵 A 的上三角部分(含对角)
int gsl_linalg_QR_decomp_r (gsl_matrix * A, gsl_matrix * T);
此方法要求 M ≥ N M\ge N M≥N,并且该方法对于“高瘦”型矩阵 ( M ≫ N M\gg N M≫N) 表现更佳
1.2 QR 解包
根据 QR 和 tau (T) 得到矩阵 Q 和矩阵 R
int gsl_linalg_QR_unpack(const gsl_matrix * QR, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * R);
int gsl_linalg_QR_unpack_r(const gsl_matrix * QR, const gsl_matrix * T, gsl_matrix * Q, gsl_matrix * R);
1.3 QR 求解线性方程组
- 根据 QR 分解得到的 QR 和 tau (或 T),求解线性方程组 A x = b Ax=b Ax=b
int gsl_linalg_QR_solve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_vector * b, gsl_vector * x);
int gsl_linalg_QR_solve_r (const gsl_matrix * QR, const gsl_matrix * T, const gsl_vector * b, gsl_vector * x);
// 置换版本
int gsl_linalg_QR_svx (const gsl_matrix * QR, const gsl_vector * tau, gsl_vector * x);
-
求解 A x = b Ax=b Ax=b 的最小二乘解(使用欧几里得范数, A ( M > N ) A(M>N) A(M>N))
Householder 版还输出残差向量 (residual)
递归版输出的向量 x 包含两个部分,x 的前 N N N 个元素为解,后 M − N M-N M−N 个元素的向量范数等于残差范数,递归版还需要一个向量工作空间 (work),长度为 N N N
int gsl_linalg_QR_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const gsl_vector * b,
gsl_vector * x, gsl_vector * residual);
int gsl_linalg_QR_lssolve_r (const gsl_matrix * QR, const gsl_matrix * T, const gsl_vector