QR 分解 - MATLAB qr - MathWorks 中国 (2024)

本页翻译不是最新的。点击此处可查看最新英文版本。

QR 分解

全页折叠

语法

R = qr(A)

[Q,R] = qr(A)

[Q,R,P] = qr(A)

[___] = qr(A,"econ")

[Q,R,P] = qr(A,outputForm)

[___] = qr(A,0)

[C,R] = qr(S,B)

[C,R,P] = qr(S,B)

[___] = qr(S,B,"econ")

[C,R,P] = qr(S,B,outputForm)

[___] = qr(S,B,0)

说明

示例

R = qr(A) 返回 QR 分解 A = Q*R 的上三角 R 因子。

示例

[Q,R] = qr(A)m×n 矩阵 A 执行 QR 分解,满足 A = Q*R。因子 Rm×n 上三角矩阵,因子 Qm×m 正交矩阵。

示例

[Q,R,P] = qr(A) 还返回一个置换矩阵 P,满足 A*P = Q*R。如果 A 为满矩阵,将选择置换矩阵,使得 abs(diag(R)) 递减。

示例

[___] = qr(A,"econ") 使用上述任意输出参数组合进行精简分解。输出的大小取决于 m×n 矩阵 A 的大小:

  • 如果 m > n,则 qr 仅计算 Q 的前 n 列和 R 的前 n 行。

  • 如果 m <= n,则精简分解与常规分解相同。

示例

[Q,R,P] = qr(A,outputForm) 指定置换信息 P 是以矩阵还是向量形式返回。例如,如果 outputForm"vector",则 A(:,P) = Q*RoutputForm 的默认值是 "matrix",满足 A*P = Q*R

[___] = qr(A,0) 等效于 qr(A,"econ","vector")。不建议使用此语法。改用 "econ" 选项。

示例

[C,R] = qr(S,B) 计算 C = Q'*B 和上三角因子 R。您可以使用 CR 计算稀疏线性系统 S*X = BX = R\C 的最小二乘解。

示例

[C,R,P] = qr(S,B) 还返回置换矩阵 P,选择该矩阵是为了减少 R 中的填充。您可以使用 CRP 计算稀疏线性系统 S*X = BX = P*(R\C) 的最小二乘解。

示例

[___] = qr(S,B,"econ") 使用上述任意输出参数组合进行精简分解。输出的大小取决于 m×n 稀疏矩阵 S 的大小:

  • 如果 m > n,则 qr 仅计算 CR 的前 n 行。

  • 如果 m <= n,则精简分解与常规分解相同。

示例

[C,R,P] = qr(S,B,outputForm) 指定置换信息 P 是以矩阵还是向量形式返回。例如,如果 outputForm"vector",则 S*X = B 的最小二乘解是 X(P,:) = R\CoutputForm 的默认值为 "matrix",此时 S*X = B 的最小二乘解是 X = P*(R\C)

[___] = qr(S,B,0) 等效于 qr(S,B,"econ","vector")。不建议使用此语法。改用 "econ" 选项。

示例

全部折叠

Q-Less QR 分解

打开实时脚本

求 5×5 幻方矩阵的 QR 分解。指定一个输出参数以只返回上三角因子。

A = magic(5);R = qr(A)
R = 5×5 -32.4808 -26.6311 -21.3973 -23.7063 -25.8615 0 19.8943 12.3234 1.9439 4.0856 0 0 -24.3985 -11.6316 -3.7415 0 0 0 -20.0982 -9.9739 0 0 0 0 -16.0005

矩阵的完整 QR 分解

打开实时脚本

通过指定两个输出参数来计算幻方测试矩阵的完整 QR 分解。

A = magic(5);[Q,R] = qr(A)
Q = 5×5 -0.5234 0.5058 0.6735 -0.1215 -0.0441 -0.7081 -0.6966 -0.0177 0.0815 -0.0800 -0.1231 0.1367 -0.3558 -0.6307 -0.6646 -0.3079 0.1911 -0.4122 -0.4247 0.7200 -0.3387 0.4514 -0.4996 0.6328 -0.1774
R = 5×5 -32.4808 -26.6311 -21.3973 -23.7063 -25.8615 0 19.8943 12.3234 1.9439 4.0856 0 0 -24.3985 -11.6316 -3.7415 0 0 0 -20.0982 -9.9739 0 0 0 0 -16.0005

在计算机精度范围内验证 A=QR

norm(A-Q*R)
ans = 9.5562e-15

置换 QR 分解

打开实时脚本

指定三个输出参数以返回一个置换矩阵或向量,该置换矩阵或向量可减少 QR 分解的 R 因子中的填充。

计算 west0479 稀疏矩阵的 QR 分解。指定三个输出以返回满足 AP=QR 的置换矩阵。

load west0479A = west0479;[Q,R,P] = qr(A);

在计算机精度范围内验证置换矩阵 P 满足 A*P = Q*R

norm(A*P-Q*R,"fro")
ans = 3.3521e-10

现在指定 "vector" 选项以将 p 以置换向量形式返回。

[Q,R,p] = qr(A,"vector");

在计算机精度范围内验证置换向量 p 满足 A(:,p) = Q*R

norm(A(:,p) - Q*R,"fro")
ans = 3.3521e-10

验证对于稀疏输入,在分解中使用置换矩阵或置换向量所得的 R 因子的非零项比使用非置换分解的少。

[Q1,R1] = qr(A);spy(R1)

QR 分解 - MATLAB qr- MathWorks 中国 (1)

spy(R)

QR 分解 - MATLAB qr- MathWorks 中国 (2)

结果表明置换分解产生的 R 因子的非零值明显减少。

用精简 QR 因子求解线性系统

打开实时脚本

使用系数矩阵的精简 QR 分解来求解线性系统 Ax=b

使用 magic(10) 的前五列创建一个 10×5 系数矩阵。对于线性方程 Ax=b 的右侧,使用矩阵的行总和。在这种设置下,方程 x 的解应为由 1 组成的向量。

A = magic(10);A = A(:,1:5)
A = 10×5 92 99 1 8 15 98 80 7 14 16 4 81 88 20 22 85 87 19 21 3 86 93 25 2 9 17 24 76 83 90 23 5 82 89 91 79 6 13 95 97 10 12 94 96 78 11 18 100 77 84
b = sum(A,2)
b = 10×1 215 215 215 215 215 290 290 290 290 290

计算 A 的精简 QR 分解。然后用 x(p,:) = R\(Q\b) 求解线性系统 QRx=b。由于 Q 是正交矩阵,此方程与 x(p,:) = R\(Q'*b) 相同。

[Q,R,p] = qr(A,"econ","vector")
Q = 10×5 -0.0050 -0.4775 -0.0504 0.5193 0.0399 -0.0349 -0.5001 -0.0990 -0.1954 -0.2006 -0.4384 0.1059 -0.4660 0.4464 0.0628 -0.0947 -0.4151 -0.2923 -0.2542 0.5274 -0.1246 -0.4117 -0.2812 -0.1326 -0.4130 -0.3787 0.0209 0.2702 0.4697 0.0390 -0.4085 -0.0017 0.2217 -0.2450 -0.2015 -0.0648 -0.3925 0.6939 0.0669 0.1225 -0.4683 0.0833 0.0283 -0.3038 0.5265 -0.4982 0.0867 0.0394 -0.1822 -0.4138
R = 5×5 -200.7112 -55.5026 -167.6040 -84.7237 -168.7997 0 -192.1053 -40.3557 -152.4040 -39.2814 0 0 101.3180 -89.4254 96.0172 0 0 0 41.0248 -14.9083 0 0 0 0 24.6386
p = 1×5 3 1 5 2 4
x(p,:) = R\(Q\b)
x = 5×1 1.0000 1.0000 1.0000 1.0000 1.0000

生成 R 的对角线的半对数图,以确认置换分解产生的 R 因子的 abs(diag(R)) 是递减的。将 A 的奇异值绘制在同一个图中进行比较。实际上,R 的对角线值与 A 的奇异值具有类似的行为。因此,您可以使用 R 的对角线值来衡量矩阵 A 的奇异程度。

semilogy(abs(diag(R)),"-o")hold onsemilogy(svd(A),"r-o")legend("Diagonal of R","Singular Values of A")

QR 分解 - MATLAB qr- MathWorks 中国 (3)

求解稀疏线性系统

打开实时脚本

求解稀疏线性系统,并使用结果查看向量 b 有多少位于 S 的列空间中。

创建一个随机 500×20 稀疏矩阵(密度为 10%)和一个由 1 组成的向量。使用 qr 将矩阵分解为因子 RC = Q'*b

S = sprand(500,20,0.1);b = ones(500,1);[C,R] = qr(S,b,"econ");

使用这些结果求解 Sx=b,解为 x = R\C

x = R\C;

以恒等式 b2=Sx-b2+C2 为例。

除以 b 的范数,会得到一个新的恒等式,表明 b 有多少位于 S 的列空间中:

Sx-b2b2+C2b2=1.

第一个项说明 b 有多少不在 S 的列空间中,而第二个项说明 b 有多少 S 的列空间中。

t1 = norm(S*x-b)^2/norm(b)^2
t1 = 0.4000
t2 = norm(C)^2/norm(b)^2
t2 = 0.6000

求解矩形稀疏线性系统

打开实时脚本

使用 qr 求解矩阵方程 Sx=B,其中 S 为矩形稀疏系数矩阵。

加载 west0479 稀疏矩阵,并将前 200 列用作线性系统中的矩形系数矩阵。对于方程的右侧,使用 S 的行总和。在这种设置下,Sx=B 的解是由 1 组成的向量。

load west0479S = west0479(:,1:200);B = sum(S,2);

使用 qr 以及两个输入和三个输出求解 Sx=B。线性系统的解是 x = P*(R\C)

[C,R,P] = qr(S,B);x = P*(R\C);

在计算机精度范围内验证 Sx-B=0

norm(S*x-B)
ans = 8.3874e-11

注意:要计算上三角因子 R 和置换矩阵 P,但避免计算正交矩阵 Q(这通常是对 qr 的调用中计算量最大的部分),您可以将 B 指定为空矩阵:

emptyB = zeros(size(S,1),0);[~,R,P] = qr(S,emptyB);

输入参数

全部折叠

A输入矩阵
矩阵

输入矩阵,指定为满矩阵或稀疏矩阵。

数据类型: single | double
复数支持:

S输入系数矩阵
矩阵

输入系数矩阵,指定为稀疏矩阵。使用两个输入矩阵,qr 计算线性系统 S*X = B 的最小二乘解。

数据类型: double
复数支持:

B右侧矩阵
矩阵

右侧矩阵,指定为满矩阵或稀疏矩阵。使用两个输入矩阵,qr 计算 C = Q'*B,您可以用它来求解线性系统 S*X = B

数据类型: single | double
复数支持:

outputForm置换输出的形状
"matrix" (默认) | "vector"

置换输出的形状,指定为 "matrix""vector"。此标志控制置换输出 P 是以置换矩阵还是置换向量形式返回。要使用此选项,您必须指定 qr 的三个输出参数。

  • 如果 outputForm"vector",则 P 是满足 A(:,P) = Q*R 的置换向量。

  • outputForm 的默认值是 "matrix",满足 A*P = Q*R

示例: [Q,R,P] = qr(A,"vector")

输出参数

全部折叠

Q — 正交因子
矩阵

正交因子,以矩阵形式返回,满足 A = Q*R,其中 Am×n 矩阵。

  • 对于完整分解,qr(A)m×m 正交矩阵形式返回 Q,满足 QHQ=QQH=Im

  • 对于满足 m > n 的矩形 A,精简分解 qr(A,"econ") 仅计算 Q 的前 n 列和 R 的前 n 行。Q 的列构成 A 的列空间的标准正交基。

不同的计算机和 MATLAB® 版本可能在 Q 中生成不同列,但它们在数值上依然精确。QR 中相应的行和列可以翻转其符号,因为这不会影响 A = Q*R 表达式的值。

R — 上三角因子
矩阵

上三角因子,以满足 A = Q*R 的矩阵形式返回。当 A 为满矩阵并且指定了三个输出(即 [Q,R,P] = qr(A))时,R 的对角线元素按降序排列。

P — 置换信息
矩阵 | 向量

置换信息,以矩阵或向量形式返回。P 的形状取决于 outputForm 的值。此外,qr 需要选择 P 以满足不同标准,具体取决于第一个输入矩阵是满矩阵还是稀疏矩阵:

  • 满矩阵 - qr 选择的 P 要使 abs(diag(R)) 递减。

  • 稀疏矩阵 - qr 选择的 P 要减少 R 中的填充。

C — 线性系统因子
矩阵

线性系统因子,以矩阵形式返回,需满足 C = Q'*BS*X = B 的最小二乘解是 X = R\C。如果指定了置换输出 P,则解是 X = P*(R\C)X(P,:) = R\C,具体取决于 outputForm 的值:

  • 如果 outputForm"vector",则 S*X = B 的最小二乘解是 X(P,:) = R\C

  • outputForm 的默认值为 "matrix",此时 S*X = B 的最小二乘解是 X = P*(R\C)

提示

  • 要求解涉及相同系数矩阵的多个线性系统,请使用 decomposition 对象。

  • 对于语法 [C,R] = qr(S,B),仅当 S 不具有低秩时,X = R\C 的值才是 S*X = B 的最小二乘解。

参考

[1] Anderson, E., ed. LAPACK Users’ Guide. 3rd ed. Software, Environments, Tools. Philadelphia: Society for Industrial and Applied Mathematics, 1999. https://doi.org/10.1137/1.9780898719604.

[2] Davis, Timothy A. “Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing Sparse QR Factorization.” ACM Transactions on Mathematical Software 38, no. 1 (November 2011): 1–22. https://doi.org/10.1145/2049662.2049670.

扩展功能

版本历史记录

在 R2006a 之前推出

全部展开

将继续支持语法 [___] = qr(A,0)[___] = qr(S,B,0),但不再推荐使用。请改用 "econ" 选项来执行精简分解。

使用 "econ" 选项通过 qr 计算精简分解。除非指定第三个输出,否则功能与 qr(A,0) 相同。

语法 R = qr(A) 始终以上三角矩阵形式返回 R,无论 A 是满矩阵或稀疏矩阵都是如此。以前,对于满矩阵 A,单输出语法返回 R 矩阵,其中 Householder 向量位于矩阵的下三角部分。这些向量部分定义 Q 矩阵。

另请参阅

lu | chol | null | orth | qrdelete | qrinsert | qrupdate | decomposition | lsqminnorm | rank

主题

  • 分解
  • 线性方程组

MATLAB 命令

您点击的链接对应于以下 MATLAB 命令:

 

请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。

QR 分解 - MATLAB qr- MathWorks 中国 (4)

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

Americas

Europe

Asia Pacific

Contact your local office

QR 分解 - MATLAB qr
- MathWorks 中国 (2024)

References

Top Articles
Latest Posts
Article information

Author: Francesca Jacobs Ret

Last Updated:

Views: 6590

Rating: 4.8 / 5 (48 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Francesca Jacobs Ret

Birthday: 1996-12-09

Address: Apt. 141 1406 Mitch Summit, New Teganshire, UT 82655-0699

Phone: +2296092334654

Job: Technology Architect

Hobby: Snowboarding, Scouting, Foreign language learning, Dowsing, Baton twirling, Sculpting, Cabaret

Introduction: My name is Francesca Jacobs Ret, I am a innocent, super, beautiful, charming, lucky, gentle, clever person who loves writing and wants to share my knowledge and understanding with you.