返回目录

QR_Method.m

text/plain
1.28 KB
2025-10-22 16:15:58

文件预览

clear; clc;  

% 1. 输入待分解的矩阵A
A = [1 2 3 4; 
     4 5 6 5; 
     7 8 9 6;
     1 3 5 7];  
fprintf('待进行QR分解的原始矩阵A:\n');
disp(A);  % 显示原始矩阵,便于后续结果对比

[m,n] = size(A);  % 获取矩阵A的行列数
Q = eye(n);       % 初始化正交矩阵Q为n阶单位矩阵

% 循环构造Householder矩阵,逐步将A化为上三角矩阵
for j = 1 : n - 1 
    sigma = sign(A(j,j)) * norm(A(j:n,j), 2);
    u = A(j:n,j) + sigma * eye(n - j + 1, 1);
    beta = sigma * (sigma + A(j,j));
    I = eye(n - j + 1);
    Hj = I - (1 / beta) * (u * u');
    Hk = blkdiag(eye(j - 1), Hj);
    Q = Q * Hk;   
    A = Hk * A;  
end 

R = A;  % 循环结束后,A已变为上三角矩阵R

fprintf('\n==================== QR分解结果 ====================\n');
fprintf('1. 正交矩阵Q:\n');
disp(Q);  % 显示正交矩阵Q
fprintf('\n2. 上三角矩阵R:\n');
disp(R);  % 显示上三角矩阵R

% 验证分解正确性(Q*R应接近原始矩阵,误差为浮点计算误差)
fprintf('\n==================== 结果验证 ====================\n');
fprintf('Q*R的计算结果(应与原始矩阵A近似):\n');
disp(Q * R);
fprintf('\n说明:Q*R与原始矩阵的微小差异为浮点计算误差,可忽略。\n');