clc;clear;close all;
A=[8, 0, 00, 7,-10,-1, 2];[Q,L] = ql_decomposition(A);
disp([Q,L]);
function [Q,L] = ql_decomposition(A)n = size(A,1);% 初始化 Q 为单位矩阵Q = eye(n);% 初始化 L 为零矩阵L = zeros(n);
flag=1;
while(flag) % 在矩阵 A 上应用 Givens 旋转for i = 1:n-1% 计算 Givens 矩阵R = eye(n);d=A(i+1,i+1);e_1= A(i,i+1);if abs(e_1) <= 10^(-9) %非0次对角线元素小于阈值Givens 矩阵变为单位阵c = 1;s = 0;elsec = d / sqrt(d^2 + e_1^2);s = e_1 / sqrt(d^2 + e_1^2);endR(i:i+1, i:i+1) = [c, s; -s, c];% 将A进行QL分解A=Q*LL = R' * A;Q = R;A = L*Q;%逆序相乘,更新 AendL_triu=triu(L,1);%只保留L的上三角矩阵元素if any(L_triu >= 10^(-9))%检查L的上三角矩阵元素是否全部为0flag = 1;%若仍有非0元素,flag = 1,继续分解更新后的Aelseflag = 0;%若无,flag = 0,跳出end
end
end