メカニズムが正しいことを確認するために、MATLABでQR分解アルゴリズムをコーディングしています。main関数のコードは次のとおりです。
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でこの分解を実装するための最も簡単な方法の1つであると確信しています。しかし、行列Aでテストすると、生成されるRは本来あるべき直角三角形ではありません。Qは直交しており、Q * R = Aであるため、アルゴリズムはいくつかのことを正しく実行していますが、正確に正しい因数分解を生成していません。たぶん私は問題をずっと見つめていましたが、私が見落としていたものについての洞察をいただければ幸いです。