对于使用经典 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