Você está na página 1de 3

El código en Matlab es:

%"A" es una matriz de rango completo, la función devuelve dos matrices: Q (la matriz ortonormal) y R (la
%matriz triangular).

%Problemas con este algoritmo: Sólo da la factorización QR reducida, y sólo funciona para matrices
%de rango completo (es decir: ninguna columna es múltiplo de, y/o resultado de, sumar otras columnas de
%la mariz entre sí).

function [Q, R] = gs(A)


[m, n] = size(A);
R = zeros(n, n);
V = A;
Q=zeros(m, n);

for i =1:n
R(i,i)= norm(V(:,i));
Q(:,i)= V(:,i)/R(i,i);

for j=i+1:n
R(i,j)= (Q(:,i)')*V(:,j);
V(:,j)=V(:,j) - R(i,j)*Q(:,i);
end
end

function [Q, R] = gsC(A)


clc;
[m, n] = size(A);
R = zeros(m, n);
V = A;
Q=zeros(m, n);

k=1; % inicializo eta variable, sólo la uso para matrices de rango


deficiente

for i =1:n
R(i,i)= norm(V(:,i));

if abs(R(i,i)) > 1.0e-10


Q(:,i)= V(:,i)/R(i,i);
else % salió cero! La matriz A es de rango deficiente
r= zeros(1, m); % este va a ser el vector que reemplazará a la
fila problemática de A

Q(:,i)= r;
Q(k, i)=1;
k=k+1;
Q2 = Q; % Q2 tendrá los valores de Q, en Q irá la nueva base
ortonormal

% ortogonalizo otra vez aplicando Gram-Schmidt a la matriz Q


para
% hallar un vector con el qué reemplazar a la fila
problemática y
% seguir teniendo una base ortonormal
for j = 1 : i-1
r(j) = (Q2(:,j)')*Q2(:,i);
Q(:,i)=Q(:,i) - r(j)*Q2(:,j);
Q(:,i)=Q(:,i)/norm(Q(:,i));
end
end

for j=i+1:n
R(i,j)= (Q(:,i)')*V(:,j);
V(:,j)=V(:,j) - R(i,j)*Q(:,i);
end
end

% hasta aquí Q y R son la descomposición reducida


% acá hallo la completa, Gram Schmidt otra vez
if m > n
I = eye(m, m - n);
Q=[Q I];
V=Q;
r= zeros(1, m);

k=0;
for i=n+1:m
for j = 1 : n + k
r(j) = (V(:,j)')*V(:,i);
Q(:,i)=Q(:,i) - r(j)*V(:,j);
Q(:,i)=Q(:,i)/norm(Q(:,i));
end
k=k+1;
end
end

function [Q, R] = houseHolder(A)


clc;
[m n] = size(A);

R= A;
Q = eye(m,m);

n1=min(m,n);

for i= 1:n1
x = R(i:m, i);
s=0;

if x(1)==0
s = 1;
else
s= sign(x(1));
end

e = zeros(m - i + 1, 1);
e(1)=1;
u = s * norm(x) * e + x;
u = u / norm(u);
R(i:m, i:n) = R(i:m, i:n) - 2*(u*u')*R(i:m, i:n);
Q(:,i:m) = Q(:,i:m) - Q(:,i:m)*(2*u*u');
end

Você também pode gostar