2013-08-04 11 views
1

我正在嘗試編寫一個程序來獲取一個mxn矩陣,QR將其分解。Matlab QR housefooter factorisation incorrect output

尚未完成,但我遇到了問題。 我試着運行我的程序與維基百科http://en.wikipedia.org/wiki/QR_decomposition

A=[12,-51,4;6,167,-68;-4,24,-41] 

他們所謂的Q1,Q2所示的例子......我叫QTEMP。每次我計算Qtemp,我打印它,以便看到我得到與維基百科相同的結果。對於第一季我做,但對於第二季我沒有。

他們的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。

+0

任何原因你的矩陣的A(1,1)是15,維基百科的那個在那個位置有12? – horchler

+0

是的,印刷錯誤。我用正確的一個來測試我的代碼。現在修復了這個帖子。 –

回答

1

看起來你並沒有減少每次迭代塊的大小。一切似乎都是相同的mn(你沒有在你的代碼中定義)的功能。見行on the Wikipedia page他們定義A ′並使用它建立Q (只是較低的三分之二)。下面是我的一些代碼,適用於執行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功能。在代碼中查看我的評論以瞭解如何翻轉標誌。