next up previous
Siguiente: Aritmética Superior: Comenzando con PDL: un Anterior: Tutorial de PDL

Subsecciones

Creando PDLs

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.

``Piddles'' sencillos

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]
]

``Piddles'' más complejos

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]


next up previous
Siguiente: Aritmética Superior: Comenzando con PDL: un Anterior: Tutorial de PDL

Download this document: [src.tar.gz][ps.gz][html.tar.gz][dvi.gz]

Congreso HispaLinux 2000