Cómo ver el código fuente de SVD en matlab
================. ==== ======================================
función [u, s , v] = svdsim( a, tol)
Programa SVD simple SVDSIM
Un programa simple que demuestra cómo usarlo
Descomposición QR para realizar SVD de la matriz.
A puede ser un rectángulo y un número complejo.
Uso: [U, S, V] = SVDSIM(A)
o S = SVDSIM(A)
Donde A = U*S*V', Sgt;=0, U'*U = Iu, y V'*V = Iv
El La idea es "tirar" gradualmente de U desde la izquierda usando la descomposición QR de A, y luego "tirar" de V desde la derecha usando la transpuesta QR de A.
Este proceso hace que A primero se convierta en un triángulo inferior y luego, alternativamente, en un triángulo superior. Finalmente, A se convierte en un triángulo superior y un triángulo inferior,
(es decir, diagonal), con los valores singulares ubicados en la diagonal.
Matlab "El proceso de triangulación de Matlab es el proceso de transponer A y "tirar" V desde el lado derecho.
Siempre se debe preferir la rutina SVD propia de Matlab,
pero esta rutina proporciona una "alternativa algorítmica" simple
dependiendo de las necesidades del usuario: SVD, EIG, QR, BIDIAG, HESS
Paul Godfrey
23 de octubre de 2006
if ~ exist('tol', 'var' )
tol=eps*1024;
end
Reservar espacio con antelación
sizea =size(a);
loopmax=100*max(sizea);
loopcount=0;
O use Bidiag(A) Inicializar U, S y V
u=ojo(tamañoa(1));
s=a';
v=ojo(tamañoa(2)
; Err= realmax;
mientras Errgt; tol amp; loopcountlt;
log10([Err tol loopcount loopmax]); ]=qr(s'); u=u*q;
[q, s]=qr(s'); > Salir cuando estemos "cerca"
e=triu(s, 1
E=norm(e(:)); norma(diag(s));
si F==0, F=1; final
Err=E/F;
loopcount=loopcount 1; ;
end
[Err/tol loopcount/loopmax]
Corregir el inicio de sesión S
ss= diag(s);
s=zeros(sizea);
para n=1: longitud(ss)
ssn=ss(n);
s(n,n)=abs(ssn);
si ssnlt;0
u(:,n)=-u(:,n) ;
fin
fin
if nargoutlt;=1
u=diag(s);
fin
volver