function [Q,A,k]=R_QLR(A,X)
% Givens旋转变换的矩阵分解 的QL(R)方法
[m,n]=size(A);
C2=1;Q=eye(n);k=0;
switch X
case 1
fun=@triu;option=1;opbreak=1;%取矩阵上半部分,QL分解
case 2
fun=@tril; option=-1;opbreak=n;%取矩阵下半部分,QR分解
end
while abs(C2)>1e-10
A1 = fun(A,option);
[C1,I1]=max(abs(A1));[C2,j]=max(C1);i=I1(j);%寻绝对值最大值位置
if j==opbreak
break;
end
d=A(i,j)/A(j,j);
c=1/(sqrt(1+d^2));s=-d*c;
R=eye(n);R(i,i)=c;R(i,j)=s;R(j,i)=-s;R(j,j)=c;
Q=Q*R';
A=R*A;
k=k+1;%计算迭代次数
end