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 bez formiranja matrice :
Za računanje produkta pomoću prethodne jednakosti potrebno je samo računskih operacija. Slično, produkt u praksi se računa pomoću formula:
Koristeći prethodna poboljšanja možemo napisati funkcije za računanje QR rastava. Prva funkcija računa vektor iz zadanog vektora prema formuli (6.4) i napomeni 6.3:
function v=House(x) % računa 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ća funkcija računa umnožak bez formiranja matrice prema formulama (6.5):
function B=mnoziHouse(v,A) % računa 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, sljedeća funkcija računa QR rastav matrice prema postupku opisanom u prethodnom poglavlju:
function [Q,R]=mojQR(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)=mnoziHouse(v, A(i:m,i:n)) Q(i:m,:)=mnoziHouse(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] |