gpt4 book ai didi

matlab - 使用 Givens 旋转的 QR 分解算法

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:57 25 4
gpt4 key购买 nike

我正在 MATLAB 中编写 QR 分解算法,只是为了确保我的机制正确。这是主要功能的代码:

    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 中。但是当我在矩阵 A 上测试它时,生成的 R 不是直角三角形。 Q 是正交的,并且 Q*R = A,因此该算法在做一些正确的事情,但它并没有产生完全正确的因式分解。也许我只是盯着这个问题看得太久了,但如果能对我忽略的内容有任何见解,我们将不胜感激。

最佳答案

这似乎有更多的错误,我看到的:

  1. 您应该使用 [c,s] = GivensRotation( R(i-1,j),R(i,j) ); (注意,R 而不是 A)
  2. 原始乘法 Q = Q*G'; R = G*R 正确。
  3. r = a/b 和 r = b/a(没有减号,不确定是否重要)
  4. G([i-1, i],[i-1, i]) = [c -s; sc];

这是一个示例代码,似乎可以工作。

第一个文件,

% qrgivens.m
function [Q,R] = qrgivens(A)
[m,n] = size(A);
Q = eye(m);
R = A;

for j = 1:n
for i = m:-1:(j+1)
G = eye(m);
[c,s] = givensrotation( R(i-1,j),R(i,j) );
G([i-1, i],[i-1, i]) = [c -s; s c];
R = G'*R;
Q = Q*G;
end
end

end

第二个

% givensrotation.m
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 - 使用 Givens 旋转的 QR 分解算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com