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;
else
c = d / sqrt(d^2 + e_1^2);
s = e_1 / sqrt(d^2 + e_1^2);
end
R(i:i+1, i:i+1) = [c, s;
-s, c];
% 将A进行QL分解A=Q*L
L = R' * A;
Q = R;
A = L*Q;%逆序相乘,更新 A
end
L_triu=triu(L,1);%只保留L的上三角矩阵元素
if any(L_triu >= 10^(-9))%检查L的上三角矩阵元素是否全部为0
flag = 1;%若仍有非0元素,flag = 1,继续分解更新后的A
else
flag = 0;%若无,flag = 0,跳出
end
end
end