MANIPULACIÓN DE LISTAS

Repasamos en los siguientes ejercicios algunas de las reglas de manejo de listas.

- Construir una matriz NxM:  Matriz=Table[a(j,k),{j,1,N},{k,1,M}]

Matriz=Table[a[j,k],{j,1,5},{k,1,3}]
     {{a[1, 1], a[1, 2], a[1, 3]}, {a[2, 1], a[2, 2], a[2, 3]}, 
      
       {a[3, 1], a[3, 2], a[3, 3]}, {a[4, 1], a[4, 2], a[4, 3]},
      
       {a[5, 1], a[5, 2], a[5, 3]}}
En forma matricial:
MatrixForm[Matriz]
     a[1, 1]   a[1, 2]   a[1, 3]
     
     a[2, 1]   a[2, 2]   a[2, 3]
     
     a[3, 1]   a[3, 2]   a[3, 3]
     
     a[4, 1]   a[4, 2]   a[4, 3]
     
     a[5, 1]   a[5, 2]   a[5, 3]

- Aplicar una función f a cada elemento de una lista: Map[f,lista]. Por ejemplo, definamos puntos en el espacio, con las coordenadas de la matriz anterior:

MatrixForm[Map[Point,Matriz]]
     Point[{a[1, 1], a[1, 2], a[1, 3]}]
     
     Point[{a[2, 1], a[2, 2], a[2, 3]}]
     
     Point[{a[3, 1], a[3, 2], a[3, 3]}]
     
     Point[{a[4, 1], a[4, 2], a[4, 3]}]
     
     Point[{a[5, 1], a[5, 2], a[5, 3]}]

- Existen ocasiones en las que al aplicar Map, no nos interesa que aparezcan las llaves dentro de la variable de la función. Así, si en vez de aplicar Point a la matriz utilizamos RGBColor (que determina el color de un punto en el espacio), obtenemos:

MatrixForm[Map[RGBColor,Matriz]]
     RGBColor[{a[1, 1], a[1, 2], a[1, 3]}]
     
     RGBColor[{a[2, 1], a[2, 2], a[2, 3]}]
     
     RGBColor[{a[3, 1], a[3, 2], a[3, 3]}]
     
     RGBColor[{a[4, 1], a[4, 2], a[4, 3]}]
     
     RGBColor[{a[5, 1], a[5, 2], a[5, 3]}]

lo que no es correcto, ya que RGBColor necesita 3 variables y no una lista de 3 elementos.  Otro ejemplo vendría dado al considerar la función f[x,y,z]=x+y+z:

f[x_,y_,z_]:=x+y+z;
MatrixForm[Map[f,Matriz]]
     f[{a[1, 1], a[1, 2], a[1, 3]}]
     
     f[{a[2, 1], a[2, 2], a[2, 3]}]
     
     f[{a[3, 1], a[3, 2], a[3, 3]}]
     
     f[{a[4, 1], a[4, 2], a[4, 3]}]
     
     f[{a[5, 1], a[5, 2], a[5, 3]}]

y no obtenemos la suma de las componentes. La manera correcta es utilizar Apply a la matriz transpuesta:

MatrixForm[Apply[f,Transpose[Matriz]]]
     a[1, 1] + a[1, 2] + a[1, 3]
     
     a[2, 1] + a[2, 2] + a[2, 3]
     
     a[3, 1] + a[3, 2] + a[3, 3]
     
     a[4, 1] + a[4, 2] + a[4, 3]
     
     a[5, 1] + a[5, 2] + a[5, 3]

En el caso de RGBColor, como no es listable, tenemos que asignarle ese atributo:

SetAttributes[RGBColor,Listable];
Attributes[RGBColor]
     {Listable, Protected}

Ahora vemos que funciona correctamente:

MatrixForm[Apply[RGBColor,Transpose[Matriz]]]
     RGBColor[a[1, 1], a[1, 2], a[1, 3]]
     
     RGBColor[a[2, 1], a[2, 2], a[2, 3]]
     
     RGBColor[a[3, 1], a[3, 2], a[3, 3]]
     
     RGBColor[a[4, 1], a[4, 2], a[4, 3]]
     
     RGBColor[a[5, 1], a[5, 2], a[5, 3]]

Otra posibilidad es utilizar reglas de substitución:

MatrixForm[Map[RGBColor,Matriz]
    /.RGBColor[{x__}]->RGBColor[x]]
     RGBColor[a[1, 1], a[1, 2], a[1, 3]]
     
     RGBColor[a[2, 1], a[2, 2], a[2, 3]]
     
     RGBColor[a[3, 1], a[3, 2], a[3, 3]]
     
     RGBColor[a[4, 1], a[4, 2], a[4, 3]]
     
     RGBColor[a[5, 1], a[5, 2], a[5, 3]]

- Si queremos combinar los elementos de 2 listas, lista1 y lista2, de manera que los términos en la misma posición se agrupen en pares, una forma rápida de hacerlo es la siguiente:
Transpose[{lista1,lista2}]. Por ejemplo, asociar a cada vocal la posición que ocupa (del 1 al 5):

vocal={a,e,i,o,u};posicion={1,2,3,4,5};
Transpose[{vocal,posicion}]
     {{a, 1}, {e, 2}, {i, 3}, {o, 4}, {u, 5}}

Ejercicio 1: Generar una lista de N puntos aleatorios en el cubo unidad. Dibujarlos mediante Show y Graphics3D en color según su posición, de manera que los puntos que estén próximos tengan colores similares.

- El comando AppendTo[lista,x] añade el elemento x a lista.

lista={y};AppendTo[lista,x];lista
     {y, x}

- Flatten aplicado a una lista de listas, genera una única lista con todos los elementos.

Flatten[{{1,2,4},3,{5,6}}]
     {1, 2, 4, 3, 5, 6}

- Take[lista,n] selecciona los n primeros elementos de lista.

Take[{1,2,3,{4,5},6},4]
     {1, 2, 3, {4, 5}}

- Cases[lista,propiedad] genera una lista con todos los elementos de lista que satisfacen propiedad.

Cases[{1,2,3,4,4},4]
     {4, 4}

Ejercicio 2: Representar gráficamente el número de veces que se repiten las cifras del 0 al 9, en la expresión con N decimales del número π.

Solución al Ejercicio 1:

SetAttributes[RGBColor,Listable];
Nu=1000;
q=Table[Random[],{Nu},{3}];
qq=Map[Point,q];
rr=Apply[RGBColor,Transpose[q]];
pun=Transpose[{rr,qq}];
Show[Graphics3D[pun]]

[Graphics:Listas/Listas_gr_1.gif]

Solución al Ejercicio 2:


Nu=5000;
decimales=Flatten[Take[RealDigits[N[Pi,Nu]],1]];
Contador={};
Do[AppendTo[Contador,{k,Length[Cases[decimales,k]]}],
    {k,0,9}];
ListPlot[Contador,PlotJoined->True]

[Graphics:Listas/Listas_gr_2.gif]


Converted by Mathematica      March 1, 2002