Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo ver el código fuente de SVD en matlab

Cómo ver el código fuente de SVD en matlab

El código fuente que viene con él está cifrado y no se puede ver. Consulte el código fuente compartido por los miembros en el sitio web de Mathworks:

================. ==== ======================================

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