Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

qr

QR 分解

说明

示例

X = qr(A) 返回 QR 分解 A = Q*R 的上三角 R 因子。如果 A 为满矩阵,则 R = triu(X)。如果 A 为稀疏矩阵,则 R = X

示例

[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

示例

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

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

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

  • 如果您用精简分解指定第三个输出,则它将以置换向量形式返回,满足 A(:,P) = Q*R

示例

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

示例

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

示例

[C,R,P] = qr(S,B) 还返回置换矩阵 P。您可以使用 CRP 计算稀疏线性方程组 S*X = BX = P*(R\C) 的最小二乘解。

示例

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

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

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

  • 如果您用精简分解指定第三个输出,则它将以置换向量形式返回,满足 S*X = B 的最小二乘解是 X(P,:) = R\C

示例

[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)

示例

全部折叠

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

A = pascal(5);
X = qr(A)
X = 5×5

   -2.2361   -6.7082  -15.6525  -31.3050  -56.3489
    0.3090    3.1623   11.0680   26.5631   53.1263
    0.3090   -0.1744    1.8708    7.4833   19.2428
    0.3090   -0.4565    0.3548    0.6325    2.8460
    0.3090   -0.7387   -0.0281   -0.7490   -0.1195

X 中提取上三角因子 R

R = triu(X)
R = 5×5

   -2.2361   -6.7082  -15.6525  -31.3050  -56.3489
         0    3.1623   11.0680   26.5631   53.1263
         0         0    1.8708    7.4833   19.2428
         0         0         0    0.6325    2.8460
         0         0         0         0   -0.1195

将 Q-less QR 分解中的 R 与完整 QR 分解中的 R 因子进行比较。

[Q1,R1] = qr(A)
Q1 = 5×5

   -0.4472   -0.6325    0.5345   -0.3162   -0.1195
   -0.4472   -0.3162   -0.2673    0.6325    0.4781
   -0.4472    0.0000   -0.5345   -0.0000   -0.7171
   -0.4472    0.3162   -0.2673   -0.6325    0.4781
   -0.4472    0.6325    0.5345    0.3162   -0.1195

R1 = 5×5

   -2.2361   -6.7082  -15.6525  -31.3050  -56.3489
         0    3.1623   11.0680   26.5631   53.1263
         0         0    1.8708    7.4833   19.2428
         0         0         0    0.6325    2.8460
         0         0         0         0   -0.1195

通过指定两个输出参数来计算幻方测试矩阵的完整 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 = 1.2569e-14

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

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

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

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

norm(A*P-Q*R,'fro')
ans = 3.5451e-10

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

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

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

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

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

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

spy(R)

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

使用系数矩阵的精简 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,0)
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 on
semilogy(svd(A),'r-o')
legend('Diagonal of R','Singular Values of A')

求解稀疏线性方程组,并使用结果查看向量 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,0);

使用这些结果求解 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 west0479
S = 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 = 9.1703e-11

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

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

输入参数

全部折叠

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

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

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

数据类型: double
复数支持:

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

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

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

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

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

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

输出参数

全部折叠

输出矩阵。X 的内容取决于 A 是满矩阵还是稀疏矩阵:

  • 如果 A 为满矩阵,则 QR 分解的上三角因子是 R = triu(X)。(下三角元素是用于计算 Q 的数据的一部分。)

  • 如果 A 为稀疏矩阵,则因子是 R = X

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

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

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

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

上三角因子,以满足 A = Q*R 的矩阵形式返回。

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

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

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

线性方程组因子,以矩阵形式返回,需满足 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 的最小二乘解。

扩展功能

在 R2006a 之前推出