2013-08-04 4 views
1

mxn 행렬을 얻고 QR이 그것을 분해하는 프로그램을 작성하려고합니다.Matlab QR 하우스 홀더 인수 분해가 잘못되었습니다.

아직 완료되지 않았지만 문제가 발생했습니다. 나는 그들이 Q1라는 무엇 위키 피 디아 http://en.wikipedia.org/wiki/QR_decomposition

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

, Q2에서의 예 내 프로그램을 실행 해봤 ... 내가 QTEMP는했다. 매번 Qtemp를 계산할 때 위키피디아와 같은 결과를 얻는 것을보기 위해 인쇄합니다. Q1에서는 그렇지만 Q2에서는 그렇지 않습니다.

Q2와 광산은 같은 값이지만 다른 부호가 있습니다. 그들이 어디에 +있는 -, 그들이있는 -, 나는 + 있습니다. 두 번째 QTEMP에 대한

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 

말 그대로 그들의 알고리즘을 복사 코드로 번역하지만, 여전히 나쁜 출력 :

이 내 코드입니다.

+0

행렬의 'A (1,1)'이 15이고 Wikipedia의 행렬이 12라는 이유가 있습니까? – horchler

+0

예, 잘못 인쇄되었습니다. 내 코드를 테스트하기 위해 올바른 것을 사용했습니다. 지금 게시글을 수정했습니다. –

답변

1

각 반복마다 블록의 크기가 줄어들지 않는 것처럼 보입니다. 모든 것은 같은 mn (코드에서 정의하지 않은) 함수처럼 보입니다. on the Wikipedia page 줄을보고 A ′을 정의하고이를 사용하여 Q (아래 2/3)을 빌드하십시오. 다음은 도움이 될 수있는 3x3 행렬의 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 함수에서 다른 기호 규칙을 사용합니다. 기호를 뒤집는 방법에 대한 내 의견을 코드에서 확인하십시오.