c=PyPBLAS.pvsyr2k(alpha,a,b,beta,c[,uplo,trans])
La función "PyPBLAS.pvsyr2k" implementa la siguiente operación entre matrices teniendo en cuenta que este tipo de matrices son simétricas:
En el caso que las dimensiones de alguna de las entradas no sea correcta, la
rutina PyPBLASpvsyr2k informará de ello y no podrá finalizar la
operación.
Esta rutina se provee para matrices simétricas con elementos de tipo real o
complejo. Un detalle importante en esta rutina es la suposición que las
matrices de entrada son simétricas, de este modo se realizan los cálculos
con la parte superior (o inferior) a la diagonal. El resultado válido en la
matriz devuelta por la función será el situado en la posición que le
indiquemos a través del parámetro uplo.
Las características de cada uno de los parámetros son las siguientes:
Parametros de Entrada
uplo='U': (Valor por defecto).Se obtienen los resultados en la
diagonal principal y por encima de ella.
uplo='L': Se obtienen los resultados en la diagonal principal y por
debajo de ella.
a y
b:
trans='N': (Valor por defecto).La operación que se lleva a cabo es
:
trans='T': La operación que se lleva a cabo es :
Parametros de Salida
A continuación mostramos un ejemplo en la utilización de esta rutina:
from PyACTS import *
import PyACTS.PyPBLAS as PyPBLAS
from RandomArray import *
from Numeric import *
#Dimension of Arrays
def make_sym_b(x,y):
return x*y
def make_sym_c(x,y):
return x+y
n=6
#Initiliaze the Grid
PyACTS.gridinit()
if PyACTS.iread==1:
print "Example of using PyPBLAS 3: PvSYR2K"
print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol
print "Block's size:",PyACTS.mb,"*",PyACTS.nb
a=ones([n,n])
print "a=",a
b=fromfunction(make_sym_b,(n,n))
print "b=",b
c=fromfunction(make_sym_c,(n,n))
print "c=",c
alpha,beta=2.,3.
print "alpha=",alpha,";","beta=",beta
else:
alpha,a,b,beta,c=None,None,None,None,None
#We convert Numeric Array to PyACTS.Scalapack Array
ACTS_lib=1 # 1=Scalapack
alpha=Scal2PyACTS(alpha,ACTS_lib)
beta=Scal2PyACTS(beta,ACTS_lib)
a=Num2PyACTS(a,ACTS_lib)
b=Num2PyACTS(b,ACTS_lib)
c=Num2PyACTS(c,ACTS_lib)
#We call PBLAS routine
c= PyPBLAS.pvsyr2k(alpha,a,b,beta,c)
c_num=PyACTS2Num(c)
if PyACTS.iread==1:
print "PvSYR2K=",transpose(c_num)
PyACTS.gridexit()
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvsyr2k.py Example of using PyPBLAS 3: PvSYR2K N= 6 ;nprow x npcol: 2 x 2 Block's size: 2 * 2 a= [[1 1 1 1 1 1] [1 1 1 1 1 1] [1 1 1 1 1 1] [1 1 1 1 1 1] [1 1 1 1 1 1] [1 1 1 1 1 1]] b= [[ 0 0 0 0 0 0] [ 0 1 2 3 4 5] [ 0 2 4 6 8 10] [ 0 3 6 9 12 15] [ 0 4 8 12 16 20] [ 0 5 10 15 20 25]] c= [[ 0 1 2 3 4 5] [ 1 2 3 4 5 6] [ 2 3 4 5 6 7] [ 3 4 5 6 7 8] [ 4 5 6 7 8 9] [ 5 6 7 8 9 10]] alpha= 2.0 ; beta= 3.0 PvSYR2K= [[ 0. 1. 2. 3. 4. 5.] [ 33. 66. 3. 4. 5. 6.] [ 66. 99. 132. 5. 6. 7.] [ 99. 132. 165. 198. 7. 8.] [ 132. 165. 198. 231. 264. 9.] [ 165. 198. 231. 264. 297. 330.]]
Podemos ver en este ejemplo, que el resultado no es una matriz simétrica aunque
debiera serlo puesto que a y c lo son y el resultado de la
operación descrita ha de genera una matriz simétrica. Como por defecto
uplo='U', el resultado es una matriz simétrica con los valores
correctos situados en y por encima de la diagonal.
Si ejecutaramos c=PyPBLAS.pvsyr2k(alpha,a,b,beta,c,uplo='L'),
podríamos comprobar que los valores correctos se obtienen en y por debajo de
la diagonal principal.
See Sobre este documento... para sugerencias en cambios.