Matlab QR户主因素分解输出不正确

时间:2013-08-04 21:08:42

标签: matlab linear-algebra decomposition

我正在尝试编写一个获取mxn矩阵并且QR分解它的程序。

尚未完成,但我遇到了问题。 我尝试使用维基百科http://en.wikipedia.org/wiki/QR_decomposition

中显示的示例运行我的程序
A=[12,-51,4;6,167,-68;-4,24,-41]

他们称之为Q1,Q2 ......我打电话给Qtemp。每当我计算Qtemp时,我打印它以便看到我得到与维基百科相同的结果。我做Q1,但是对于Q2,我不这样做。

他们的Q2和我的价值相同,但标志不同。他们有一个+我有一个 - ,他们有一个 - ,我有一个+。

这是我的代码:

    Q=eye(m);
R=A;
for i=1:min(m-1,n)
    ei=zeros(n,1);
    ei(i,1)=1;
    x=A(:,i);
    for j=1:i-1
        x(j,1)=0;
    end
    u=x-norm(x)*ei;
    v=u/norm(u);
    Qtemp=eye(m)-2*(v*v');
    A=Qtemp*A;
    disp(Qtemp);
end

我真的只是复制了他们的算法并将其翻译成代码,但第二个Qtemp的输出仍然不好。

1 个答案:

答案 0 :(得分:1)

看起来你并没有减少每次迭代时块的大小。所有内容似乎都是相同mn(您未在代码中定义)的函数。查看他们定义A'的行on the Wikipedia page并使用它来构建Q 2 (只是低三分之二)。下面是我的一些代码,适用于执行可能有帮助的3乘3矩阵的QR分解。请特别注意,第二个块仅适用于A(:,2)q(2:3,:)

function [q,r]=qr3(A)

u = A(:,1);
u(1) = u(1)-(1-2*(u(1)<0))*norm(u); % Flip < to > to match sign convention of qr
u = u/norm(u);
u(~isfinite(u)) = sqrt(3)/3;
q = -2*(u*u');
q([1 5 9]) = q([1 5 9])+1;

u = q(2:3,:)*A(:,2);
u(1) = u(1)-(1-2*(u(1)<0))*norm(u); % Flip < to > to match sign convention of qr
u = u/norm(u);
u(~isfinite(u)) = sqrt(2)/2;
q(:,2:3) = q(:,2:3)*[1-2*u(1)^2 -2*u(1)*u(2);
                     -2*u(1)*u(2) 1-2*u(2)^2];
r = triu(q'*A);

上面的代码和维基百科上详述的方法使用了Matlab的qr函数的不同符号约定。请参阅我在代码中的注释,了解如何翻转符号。