为什么两种 Gram-Schmidt 算法会产生不同的 qr 分解结果?

计算科学 matlab 矩阵分解
2021-12-03 07:19:49

对于使用经典 Gram-Schmidt 算法的 qr 分解,我在下面找到了 2 种不同的实现。第一个使用for循环来计算上三角矩阵R,但第二个使用矩阵向量乘法。因为它们在数学上是等价的,但它们产生不同的结果。我找不到为什么会这样,谁能给我一些指示?此外,我经常发现,每当我从理论上理解一个算法时,如果我实现它,由于数值结果不同,我会遇到一些麻烦。这就是为什么我总是询问如何用特定代码实现算法的问题。因为即使我知道算法,我仍然无法生成正确的结果。谢谢。

%   test the classical Gram-Schmidt algorithm
clc;clear;format compact;
A = hilb(7);
%%  method 1
R(1,1) = norm(A(:,1));
Q(:,1) = A(:,1)/R(1,1);
m = size(A,2);
for j=2:m
    for i=1:j-1
        R(i,j) = Q(:,i)'*A(:,j);%   the difference between 2 methods from below
    end
    q_hat = A(:,j)-Q(:,1:j-1)*R(1:j-1,j);
    R(j,j) = norm(q_hat);
    Q(:,j) = q_hat/R(j,j);
end
%%  method 2
R1(1,1) = norm(A(:,1));
Q1(:,1)=A(:,1)/R1(1,1);
for j=2:m
    R1(1:j-1,j) = Q1(:,1:j-1)'*A(:,j);  %   the difference between 2 methods from above
    q_hat = A(:,j)-Q1(:,1:j-1)*R1(1:j-1,j);
    R1(j,j) = norm(q_hat);
    Q1(:,j) = q_hat/R(j,j);
end
%%  compare
norm(A-Q*R)
norm(Q'*Q-eye(m))
norm(A-Q1*R1)
norm(Q1'*Q1-eye(m))

我的结果如下:

ans =
     0
ans =
    0.3369
ans =
   8.9238e-10
ans =
    0.1890
0个回答
没有发现任何回复~