8.5.4 pvsyrk

c=PyPBLAS.pvsyrk(alpha,a,beta,c[,uplo,trans])

La función "PyPBLAS.pvsyrk" implementa la siguiente operación entre matrices teniendo en cuenta que este tipo de matrices son simétricas:


\begin{displaymath}\alpha \cdot A\times A^T + \beta \cdot C \to C ; \alpha \cdot A^T\times A +
\beta \cdot C \to C ;\end{displaymath}

En el caso que las dimensiones de alguna de las entradas no sea correcta, la rutina PyPBLASpvsyrk 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:

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
n,k=6,6
#Initiliaze the Grid
PyACTS.gridinit()
if PyACTS.iread==1:
        print "Example of using PyPBLAS 3: PvSYRK"
        print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol
        print "Block's size:",PyACTS.mb,"*",PyACTS.nb
        a=ones([n,k])
        print "a=",a
        c=reshape(range(n*n),[n,n])
        print "c=",c
        alpha,beta=2.,3.
        print "alpha=",alpha,";","beta=",beta
else:
        alpha,a,beta,c=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)
c=Num2PyACTS(c,ACTS_lib)
#We call PBLAS routine
c= PyPBLAS.pvsyrk(alpha,a,beta,c)
c_num=PyACTS2Num(c)
if PyACTS.iread==1:
        print "PvSYRK=",transpose(c_num)
PyACTS.gridexit()
El resultado de este código es el siguiente:
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvsyrk.py
Example of using PyPBLAS 3: PvSYRK
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]]
c= [[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]
alpha= 2.0 ; beta= 3.0
PvSYRK= [[  12.    6.   12.   18.   24.   30.]
 [  15.   33.   13.   19.   25.   31.]
 [  18.   36.   54.   20.   26.   32.]
 [  21.   39.   57.   75.   27.   33.]
 [  24.   42.   60.   78.   96.   34.]
 [  27.   45.   63.   81.   99.  117.]]
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,descc=PyPBLAS.pvsyrk(alpha,a,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.