MATLAB qr():进行QR分解(附带实例)
矩阵的正交分解又被称为 QR 分解,也就是将一个 m×n 的矩阵 A 分解为一个正交矩阵 Q(满足 QTQ=I,即其列向量两两正交,且长度为 1)和一个上三角矩阵 R 的乘积,也就是说 A=QR。QR 分解广泛应用于求解线性方程组、计算特征值和奇异值分解等问题。
在 MATLAB 中,利用 qr() 函数可以进行 QR 分解,其调用格式如下:
【实例】对矩阵进行 QR 分解。在命令行窗口中输入以下语句,并查看输出结果。
正交矩阵的特点是其列向量是两两正交的(内积为零),并且列向量的范数为 1(单位向量)。下面证明矩阵 Q 是正交矩阵。在编辑器中编写以下程序并运行。
在 MATLAB 中,利用 qr() 函数可以进行 QR 分解,其调用格式如下:
R = qr(A) % 返回 QR 分解 A = Q*R 的上三角 R 因子,适用于满矩阵和稀疏矩阵 [Q,R] = qr(A) % 对 m×n 矩阵 A 执行 QR 分解,满足 A = Q*R % 因子 R 是 m×n 上三角矩阵,因子 Q 是 m×m 正交矩阵 [Q,R,P] = qr(A) % 额外返回一个置换矩阵 P,满足 AP = QR [Q,R,P] = qr(A,outputForm) % 指定置换信息 P 是以 'matrix'(默认)还是以 'vector' 形式返回 % 指定为 'vector',则 A(:,P) = QR;默认为 'matrix',满足 AP = Q*R [C,R] = qr(S,B) % 计算 C = Q'B 和上三角因子 R % 使用 C 和 R 可以计算稀疏线性系统 SX = B 和 X = R\C 的最小二乘解 [C,R,P] = qr(S,B) % 额外返回置换矩阵 P,选择该矩阵是为了减少 R 矩阵中非零元素的填充 % 使用 C、R 和 P 可以计算稀疏线性系统 SX = B 和 X = P(R\C) 的最小二乘解
【实例】对矩阵进行 QR 分解。在命令行窗口中输入以下语句,并查看输出结果。
>> clear >> H = magic(3); >> [Q,R] = qr(H) Q = -0.8480 0.5223 0.0901 -0.3180 -0.3655 -0.8748 -0.4240 -0.7705 0.4760 R = -9.4340 -6.2540 -8.1620 0 -8.2394 -0.9655 0 0 -4.6314 >> A = Q*R A = 8.0000 1.0000 6.0000 3.0000 5.0000 7.0000 4.0000 9.0000 2.0000由结果可以看出,矩阵R是上三角矩阵,同时满足 A=QR。
正交矩阵的特点是其列向量是两两正交的(内积为零),并且列向量的范数为 1(单位向量)。下面证明矩阵 Q 是正交矩阵。在编辑器中编写以下程序并运行。
dQ = det(Q); % 计算 Q 的行列式,正交矩阵的行列式应为 ±1 disp(['行列式 det(Q): ', num2str(dQ)]) % 检查列向量之间是否正交 for i = 1:3 H = Q(:,i); % 第 i 列向量 normH = norm(H); % 计算列向量的范数 disp(['Q 的第 ', num2str(i), ' 列的范数: ', num2str(normH)]) for j = (i+1):3 M = Q(:,j); % 第 j 列向量 N = H'*M; % 计算 Q 矩阵的第 i 列与第 j 列的内积 disp(['Q 的第 ', num2str(i), ' 列与第 ', num2str(j), ' 列的内积: ', num2str(N)]) end end运行程序后可以在命令行窗口得到如下结果:
行列式 det(Q): 1 Q 的第 1 列的范数: 1 Q 的第 1 列与第 2 列的内积: 5.5511e-17 Q 的第 1 列与第 3 列的内积: 0 Q 的第 2 列的范数: 1 Q 的第 2 列与第 3 列的内积: -2.0817e-17 Q 的第 3 列的范数: 1结果证明矩阵 Q 是正交矩阵。