x= PyPBLAS.pvtrmv(a,x,[uplo='U',trans='N',diag='N'])
La función "PyPBLAS.pvtrmv" implementa la siguiente operación entre una
matriz (a
) y un vector (x
):
Las dimensiones del vector x
y de la matriz A
han de ser las
adecuadas para poder realizar la multiplicacion entre ambos.
En el caso que las dimensiones de alguna de las entradas no sea correcta, la
rutina PyPBLASpvtrmv
informará de ello y no podrá finalizar la
operación.
Por otro lado es importante señalar que esta rutina se provee únicamente para matrices triangulares (por esta razón el nombre de la función contiene 'tr'). En el caso que se pasara una matriz no triangular como matriz "a", la rutina PyBLAS_trmv realizará los cálculos como si de una triangular se tratara. Es decir, supondrá que los elementos por debajo de la diagonal (o por encima, dependiendo del valor de "diag") son ceros.
Los parámetros de entrada deberán ser de tipo real, no realizándose el cálculo en el caso que alguno de ellos sea de tipo complejo. Las características de cada uno de los parámetros ,teniendo en cuenta que son de tipo PyACTS, son las siguientes:
Parametros de Entrada
uplo='U'
: Triangular Superior (valor por defecto).
uplo='L'
: Triangular Inferior.
diag='T'
: Matriz transpuesta.
diag='N'
: Matriz NO transpuesta (valor por defecto).
diag='N'
: Matriz triangular NO unitaria (valor por defecto).
diag='U'
: Matriz triangular Unitaria.
Parametros de Salida
Debemos señalar en este punto que los tipos de datos de los vectores y
matrices son únicamente reales, de esto se deduce que no se puede dar el caso de
indicar trans='H'
puesto que la conjugada de un número real es el mismo
número real.
A continuación mostramos un ejemplo en la utilización de esta rutina:
from PyACTS import * import PyPBLAS from RandomArray import * from Numeric import * #Dimension of Arrays n=8 #Initiliaze the Grid PyACTS.gridinit() if PyACTS.iread==1: print "Example of using PyPBLAS 2: PvTRMV" print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol print "Block's size:",PyACTS.mb,"*",PyACTS.nb a=ones([n,n],Float) print "a=",a x=reshape(array(range(n),Float),[n,1]) print "x'=",transpose(x) else: a,x,alpha=None,None,None #We convert Numeric Array to PyACTS.Scalapack Array ACTS_lib=1 # 1=Scalapack a=Num2PyACTS(a,ACTS_lib) x=Num2PyACTS(x,ACTS_lib) #We call PBLAS routine x= PyPBLAS.pvtrmv(a,x) x_num=PyACTS2Num(x) if PyACTS.iread==1: print "PvTRMV'=",transpose(x_num) PyACTS.gridexit()
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvtrmv.py Example of using PyPBLAS 2: PvTRMV N= 8 ;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. 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.]] x'= [ [ 0. 1. 2. 3. 4. 5. 6. 7.]] PvTRMV'= [ [ 28. 28. 27. 25. 22. 18. 13. 7.]]
En el ejemplo mostrado podemos comprobar cómo se ha realizado la operación
descrita con los elementos que se encuentran en la diagonal y por encima de
ella. Aquellos elementos situados por debajo de la diagonal se suponen igual a
cero.
Si consideraramos que la matriz a
fuera diagonal inferior, habría que
indicarlo del siguiente modo:
x= PyPBLAS.pvtrmv(a,x,uplo='L')
PvTRMV'= [ [ 0. 1. 3. 6. 10. 15. 21. 28.]]
See Sobre este documento... para sugerencias en cambios.