Siguiente: Aritmética Superior: Comenzando con PDL: un Anterior: Tutorial de PDL |
Los PDLs o ``piddles'' son los ladrillos básicos de PDL. Constituyen escalares de Perl pero contienen mucha más información que sólo un valor numérico. Representan un vector, una matriz o cualquier matriz n-dimensional. En esta sección veremos cómo crearlos de diferentes formas.
Para crear un ``piddle'' se puede usar
el comando pdl
.
Este comando acepta un escalar de Perl,
una referencia a un ``array'' o un ``array''.
Por ejemplo, para crear un vector o un
``piddle'' unidimensional que tenga valores
de 7 a 10 escribiremos
perldl> $a=pdl([7..10]);
Para imprimir el contenido de un PDL usa
el comando print
perldl> print $a; [7 8 9 10]
Para escribir menos, en la línea de
comandos se puede omitir el punto y coma final
y además el comando print
se puede
sustituir por la letra p
sola.
Nótese que esto no es así cuando escribimos
un ``script'' en Perl.
Así pues, la siguiente expresión es equivalente
a la anterior,
perldl> p $a [7 8 9 10]
Vamos a crear un ``piddle'' con valores cualesquiera
perldl> $b=pdl([4,2,8,1,6]) perldl> p $b [4 2 8 1 6]
Vamos a crear ahora uno bidimensional
perldl> $b=pdl([ [3,4,5], [2,8,3] ]) perldl> p $b [ [3 4 5] [2 8 3] ]
El comando sequence
crea un vector con una secuencia de valores.
Acepta como argumentos un ``array'' especificando
la longitud de cada una de las dimensiones
del ``piddle''.
Por ejemplo, esta línea crea un vector con valores
desde 0 a 15.
perldl> $d=sequence(15); perldl> p $d [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
Para crear una matriz 3 x 4
perldl> $m=sequence(3,4); perldl> p $m [ [ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11] ]
El comando zeroes
crea un ``piddle''
relleno de ceros con las dimensiones
dadas por sus argumentos.
Para crear una matriz 6 x 7 escribiremos
perldl> $r=zeroes(6,7); perldl> p $r [ [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] [0 0 0 0 0 0] ]
Y si queremos un ``piddle'' de cualquier dimensión
con valores ascendentes en el eje x ? Para ello
es útil el comando xvals
, el cual acepta
como argumentos las longitudes de cada una
de las dimensiones que queremos obtener
perldl> $x=xvals(3,2); perldl> p $x [ [0 1 2] [0 1 2] ]
Un comando similar existe para recorrer el eje y
perldl> $y=yvals(3,2); perldl> p $y [ [0 0 0] [1 1 1] ]
Los comandos mencionados recorren valores
enteros que comienzan en cero. Pero a veces
queremos más flexibilidad y queremos
comenzar en un valor x determinado
y acabar en otro. Esto se puede conseguir
con el comando xlinvals
perldl> $a=zeroes(3,2); perldl> $x=$a->xlinvals(0.5,1.5); perldl> p $x [ [0.5 1 1.5] [0.5 1 1.5] ]
Nótese que este comando acepta tres
argumentos, un ``piddle'' con dimensiones
idénticas al ``piddle'' que queremos
crear, un valor de inicio y un valor final.
En esta última expresión se ha utilizado
la notación orientada a objetos de Perl,
que en este caso hace el comando más legible.
Esta expresión es totalmente equivalente
a haber colocado la variable que aparece antes
del símbolo ->
como primer argumento
de la función. Así pues una expresión equivalente
sería
perldl> $a=zeroes(3,2); perldl> $x=xlinvals($a,0.5,1.5); perldl> p $x [ [0.5 1 1.5] [0.5 1 1.5] ]
En lo que sigue utilizaremos la notación que parezca más intuitiva según el comando que utilizemos indistintamente.
Existe también un comando análogo para los valores del eje y
perldl> $a=zeroes(2,3) perldl> $y=$a->ylinvals(0.3,1.3); perldl> p $y [ [0.3 0.3] [0.8 0.8] [1.3 1.3] ]
Podemos anidar varias funciones unas dentro de otras de la siguiente forma
perldl> $y=ylinvals(zeroes(2,3),0.3,1.3); perldl> p $y [ [0.3 0.3] [0.8 0.8] [1.3 1.3] ]
Usando la notación orientada a objetos podemos
concatenar varios comandos con el símbolo ->
y obtendremos una expresión totalmente equivalente
a la anterior
perldl> $y=zeroes(2,3)->ylinvals(0.3,1.3); perldl> p $y [ [0.3 0.3] [0.8 0.8] [1.3 1.3] ]
De nuevo, cualquier notación será utilizada indistintamente.
Los comandos xlinvals
y ylinvals
son útiles para crear ``piddles'' que será utilizados
luego como entrada de los ejes x y y para
representarlos gráficamente o como entrada
a una función dada.
El siguiente ejemplo calcula los valores de una función gaussiana bidimensional
perldl> $x=zeroes(20,20)->xlinvals(-0.5,0.5); perldl> $y=zeroes(20,20)->ylinvals(-0.5,0.5); perldl> $gaus=exp( -($x**2)/0.05 - ($y**2)/0.02 );
También podemos crear números aleatorios
entre cero y uno dentro de un ``piddle'' de dimensiones
dadas con el comando random
.
perldl> $r=random(2,3) perldl> p $r [ [0.84018772 0.39438293] [0.78309922 0.79844003] [0.91164736 0.19755137] ]
De forma natural, cuando asignamos
un contenido a una variable de PDL
con el símbolo igual, =
,
no siempre se crea una copia nueva
de los datos, sino que a menudo
utiliza la mismas posiciones de memoria
que la variable original.
Para realmente crear una copia
nueva e independiente de un ``piddle'' hay
que usar el comando copy
tal
y como aparece en el siguiente ejemplo
perldl> $a=pdl[1,2,3] perldl> $b=$a->copy perldl> p $a [1 2 3] perldl> p $b [1 2 3]