9.3.2 pvgesvd

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 $M \times N$, opcionalmente calcula los vectores singulares por la izquierda y/o por la derecha. La descomposición en valores singulares puede ser expresada como:


\begin{displaymath}A= U \times SIGMA \times V^T\end{displaymath}

donde $SIGMA$ es una matriz de tamaño $M \times N$ con todos sus elementos igual a cero menos los min(M,N) de su diagonal principal. Los elementos de la diagonal principal de $SIGMA$ son valores únicos de $A$ y las columnas de $U$ y $V$ son los correspondientes vectores únicos por la derecha y por la izquierda respectivamente. Los valores singulares son devueltos en el vector $S$ en orden decreciente y sólo se calculan las primeras min(M,N) columnas de $U$ y las primeras min(M,N) filas de $V^T$.

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:

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()
De esta rutina queremos destacar el hecho que 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
See Sobre este documento... para sugerencias en cambios.