Tôi đang mã hóa thuật toán phân tách QR trong MATLAB, chỉ để đảm bảo rằng tôi có cơ chế chính xác. Dưới đây là mã cho các chức năng chính:Thuật toán phân tách QR bằng cách sử dụng Givens Rotations
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
Chức năng GivensRotation phụ được đưa ra dưới đây:
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
tôi đã thực hiện nghiên cứu và tôi khá chắc chắn đây là một trong những cách đơn giản nhất để thực hiện phân tách này, đặc biệt là trong MATLAB. Nhưng khi tôi thử nghiệm nó trên một ma trận A, R được tạo ra không phải là hình tam giác bên phải. Q là trực giao, và Q * R = A, vì vậy thuật toán đang làm một số điều đúng, nhưng nó không tạo ra chính xác yếu tố chính xác. Có lẽ tôi đã chỉ nhìn chằm chằm vào vấn đề quá lâu, nhưng bất kỳ cái nhìn sâu sắc như những gì tôi đã bỏ qua sẽ được đánh giá cao.
Believe tôi đã tìm thấy lỗi. Thay vì 'Q = Q * G '; R = G * R; 'Tôi nên viết 'Q = Q * G; R = G '* R' Trong việc đảo ngược chuyển vị trên các ma trận, tôi đã thực hiện các phép xoay theo hướng sai, do đó tạo ra một hệ số khác nhau. –