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 bez formiranja matrice prema formulama (2.4):
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 oprema postupku opisanom u prethodnom poglavlju:
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] |