我试图创建一个函数来计算Givens旋转QR分解,遵循这个伪代码。
function [Q,R] = givens(A)
[m,n] = size(A);
indexI = zeros(m,n);
indexJ = zeros(m,n);
C = zeros(m,n);
S = zeros(m,n);
for i = 1:n
for j = i+1:m
c = A(i,i)/((A(i,i))^2 + (A(j,i)^2))^0.5;
s = A(j,i)/((A(i,i))^2 + (A(j,i)^2))^0.5;
A(i,:) = c*A(i,:) + s*A(j,:);
A(j,:) = -s*A(i,:) + c*A(j,:);
indexI(j,i) = i;
indexJ(j,i) = j;
C(j,i) = c;
S(j,i) = s;
end
end
R = A;
Q = eye(m);
for i = 1:n
for j= j+1:m
Q(:,i) = c*Q(:,i) + s*Q(:,j);
Q(:,j) = -s*Q(:,i) + c*Q(:,j);
end
end
然而,我得到的R矩阵不是上三角矩阵。我似乎在这里找不到错误。
发布于 2020-04-22 16:21:54
幻灯片上有一些模糊之处。
Givens旋转实际上是一次将矩阵相乘到两行。
假设[ri;rj]
是您的两行,而Q
是相应的givens旋转矩阵。
更新是[ri; rj] = Q*[ri; rj]
,但在代码中,首先更新ri
,然后使用更新的ri
立即更新rj
。
A(i,:) = c*A(i,:) + s*A(j,:);
A(j,:) = -s*A(i,:) + c*A(j,:);
以下是错误的修复:
tmp = c*A(i,:) + s*A(j,:);
A(j,:) = -s*A(i,:) + c*A(j,:);
A(i,:) = tmp;
https://stackoverflow.com/questions/60178673
复制相似问题