首页 > 编程笔记 > MATLAB笔记 阅读:2

MATLAB qr():进行QR分解(附带实例)

矩阵的正交分解又被称为 QR 分解,也就是将一个 m×n 的矩阵 A 分解为一个正交矩阵 Q(满足 QTQ=I,即其列向量两两正交,且长度为 1)和一个上三角矩阵 R 的乘积,也就是说 A=QR。QR 分解广泛应用于求解线性方程组、计算特征值和奇异值分解等问题。

在 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 是正交矩阵。

相关文章