s,u,vt,info= pvgesvd(a[,jobu,jobvt])
La rutina pvgesvd
calcula la descomposición en valores singulares
(SVD) de una matriz A de tamaño , opcionalmente calcula los vectores
singulares por la izquierda y/o por la derecha. La descomposición en valores singulares
puede ser expresada como:
donde es una matriz de tamaño con todos sus elementos
igual a cero menos los min(M,N)
de su diagonal principal.
Los elementos de la diagonal principal de son valores únicos de y las
columnas de y son los correspondientes vectores únicos por la derecha y por la izquierda
respectivamente. Los valores singulares son devueltos en el vector en orden decreciente
y sólo se calculan las primeras min(M,N)
columnas de y las primeras min(M,N)
filas de .
Esta rutina se provee para matrices con elementos únicamente de tipo real.
Las características de cada uno de los parámetros son las siguientes:
Parámetros de Entrada
a
: Matriz de tipo PyACTS de dimensiones .
jobu
: Indica si la rutina ha de calcular o no la matriz U:
jobu='N'
: No calcula los vectores singulares por la izquierda.
jobu='V'
: Calcula las primeras min(m,n)
columnas de . Es decir los vectores singulares por la izquierda.
jobvt
: Indica si la rutina ha de calcular o no la matriz U:
jobvt='N'
: No calcula la matriz , que se corresponde con los vectores singulares por la derecha.
jobvt='V'
: Calcula las primeras min(m,n)
filas de . Es decir los vectores singulares por la derecha.
Parámetros de Salida
s
: Vector de tipo Numeric de tamaño min(m,n)
donde se devuelven los valores singulares de la matriz .
u
: Matriz de tipo PyACTS donde se devuelven los vectores singulares de la matriz por la izquierda.
vt
: Matriz de tipo PyACTS donde se devuelven los vectores singulares de la matriz por la derecha.
info
: Resultado global de la ejecución
= 0
: Ejecución con éxito
< 0
: Si el argumento i-esimo tuvo un valor ilegal, entonces info=-i
.
> 0
: No converge el cálculo. Si info=n+1
, entonces se ha detectado
heterogeneidad en los valores únicos y la exactitud de los resultados no puede ser calculada.
A continuación mostramos un ejemplo en la utilización de esta rutina:
from PyACTS import * import PyACTS.PyScaLAPACK as PySLK from RandomArray import * from Numeric import * n=8 #Initiliaze the Grid PyACTS.gridinit() if PyACTS.iread==1: print "Ejemplo de Utilizacion ScaLAPACK: PvGESVD" print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol print "Tam. Bloques:",PyACTS.mb,"*",PyACTS.nb a=8*identity(n,Float) print "a=",a else: a=None #We convert Numeric Array to PyACTS.Scalapack Array ACTS_lib=1 # 1=Scalapack a=Num2PyACTS(a,ACTS_lib) #We call PBLAS routine s,u,vt,info= PySLK.pvgesvd(a,jobu='V',jobvt='V') u_num=PyACTS2Num(u) vt_num=PyACTS2Num(vt) if PyACTS.iread==1: print "Singular Values--> s'=",transpose(s) print "Vectores Ortogonales --> u=",u_num print "Vectores Ortogonales --> vt=",vt_num print "Info:",info PyACTS.gridexit()
s
es una matriz de tipo Numeric
y será conocida por todos los procesos
que intervienen en la malla. Sin embargo, u
,y vt
son matrices de tipo PyACTS
, lo que implica que sus valores
se encuentran distribuidos entre los distintos procesos que intervienen en la malla. En el caso
que quisieramos obtener toda los valores en un único proceso, éste debería llamar a la función PyACTS2Num
tal y como
se indica en este ejemplo. El resultado de este código es el siguiente:
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPyScapvgesvd.py Ejemplo de Utilizacion ScaLAPACK: PvGESVD N= 8 ;nprow x npcol: 2 x 2 Tam. Bloques: 2 * 2 a= [[ 8. 0. 0. 0. 0. 0. 0. 0.] [ 0. 8. 0. 0. 0. 0. 0. 0.] [ 0. 0. 8. 0. 0. 0. 0. 0.] [ 0. 0. 0. 8. 0. 0. 0. 0.] [ 0. 0. 0. 0. 8. 0. 0. 0.] [ 0. 0. 0. 0. 0. 8. 0. 0.] [ 0. 0. 0. 0. 0. 0. 8. 0.] [ 0. 0. 0. 0. 0. 0. 0. 8.]] Singular Values--> s'= [ 8. 8. 8. 8. 8. 8. 8. 8.] Vectores Ortogonales --> u= [[ 1. 0. 0. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 0.] [ 0. 0. 1. 0. 0. 0. 0. 0.] [ 0. 0. 0. 1. 0. 0. 0. 0.] [ 0. 0. 0. 0. 1. 0. 0. 0.] [ 0. 0. 0. 0. 0. 1. 0. 0.] [ 0. 0. 0. 0. 0. 0. 1. 0.] [ 0. 0. 0. 0. 0. 0. 0. 1.]] Vectores Ortogonales --> vt= [[ 1. 0. 0. 0. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0. 0. 0. 0.] [ 0. 0. 1. 0. 0. 0. 0. 0.] [ 0. 0. 0. 1. 0. 0. 0. 0.] [ 0. 0. 0. 0. 1. 0. 0. 0.] [ 0. 0. 0. 0. 0. 1. 0. 0.] [ 0. 0. 0. 0. 0. 0. 1. 0.] [ 0. 0. 0. 0. 0. 0. 0. 1.]] Info: 0