我在 MATLAB 中编写了一个 QR 分解算法,只是为了确保我的机制是正确的。这是主要功能的代码:
function [Q,R] = QRgivens(A)
n = length(A(:,1));
Q = eye(n);
R = A;
for j = 1:(n-1)
for i = n:(-1):(j+1)
G = eye(n);
[c,s] = GivensRotation( A(i-1,j),A(i,j) );
G(i-1,(i-1):i) = [c s];
G(i,(i-1):i) = [-s c];
Q = Q*G';
R = G*R;
end
end
end
下面给出了子函数 GivensRotation:
function [c,s] = GivensRotation(a,b)
if b == 0
c = 1;
s = 0;
else
if abs(b) > abs(a)
r = -a / b;
s = 1 / sqrt(1 + r^2);
c = s*r;
else
r = -b / a;
c = 1 / sqrt(1 + r^2);
s = c*r;
end
end
end
我已经完成了研究,我很确定这是实现这种分解的最直接的方法之一,尤其是在 MATLAB 中。但是当我在矩阵 A 上测试它时,产生的 R 并不是应有的直角三角形。Q 是正交的,并且 Q*R = A,所以该算法在做一些正确的事情,但它并没有产生完全正确的分解。也许我只是盯着这个问题太久了,但是任何关于我忽略了什么的见解都会受到赞赏。