Za formiranje Householderove matrice potrebno je
računskih operacija. Za množenje nekog vektora
Householderovom matricom također je potrebno
računskih operacija.
No, umnožak
može se izračunati i bez formiranja
matrice
:
Koristeći prethodna poboljšanja možemo napisati potprograme za
računanje QR rastava. Prvi potprogram računa vektor iz zadanog
vektora
prema formuli (2.3) i napomeni 2.1:
function v=House(x) % racuna Householderov vektor v iz vektora x sig=sign(x(1)); if sig==0, sig=1; end v=x; v(1)=v(1)+sig*norm(v); endSlijedeći potprogram računa umnožak
function B=mnozi_House(v,A) % racuna produkt HA=(I-2*v*v'/(v'*v))*A % bez formiranja matrice H beta=-2/(v'*v); w=beta*A'*v; B=A+v*w'; endKonačno, slijedeći program računa QR rastav matrice
function [Q,R]=moj_QR(A) % QR rastav A=Q*R. A je m x n i mora biti rank(A)n. [m,n]=size(A); Q=eye(m); for i=1:min(m-1,n) v=House(A(i:m,i)); A(i:m,i:n)=mnozi_House(v, A(i:m,i:n)); Q(i:m,:)=mnozi_House(v, Q(i:m,:)); end R=A; Q=Q'; end
[Q,R]=qr(A)
.
Octave On-line[Octave On-line Home] [Octave User's Guide] |