domingo, 2 de octubre de 2022

Lista de listas

Tensores

Ya hemos visto que en Mathematica las listas planas representan vectores. Ahora veremos que las listas, que no son planas y tienen cierta estructura, representan objetos matemáticos más generales que tienen como casos particulares a los vectores y a las matrices, tensores de rango uno y dos, respectivamente.

La primera lista estructurada inmediata son las matrices (tensores de rango dos). Por ejemplo, si deseamos escribir la matriz $$\left(\begin{array}{cc} a_{1,1} & a_{1,2} \\ a_{2,1} & a_{2,2} \\\end{array}\right),$$ se introduce la siguiente lista de listas:
 (*Square matrix of dimension 2 x 2*)
 {{Subscript[a, 1, 1], Subscript[a, 1, 2]}, {Subscript[a, 2, 1], Subscript[a, 2, 2]}}
Nótese que para trabajar con subíndices usamos la función Subscript y que nuestra matriz se introduce reglón a renglón. Para evitar lo tedioso que es escribir el código de una matriz elemento por elemento, hacemos uso de la función Array de la siguiente manera:
 (*Square matrix of dimension 2 x 2 using Array*)
 Array[Subscript[a, ##] &, {2, 2}]
Desde luego, también existen identificadores para matrices, MatrixQ y SquareMatrixQ, donde el primero aplica para toda clase de matrices sin importar la dimensión de estas y el segundo está restringido a matrices que son cuadradas (mismo número de renglones que de columnas).

Para calcular la dimensión de una matriz existe Dimensions, que aplicada a la matriz anterior nos arroja el siguiente resultado:
 (*Using Dimensions with a square matrix*)
  Dimensions[Array[Subscript[a, ##] &, {2, 2}]]
  (*{2,2}*)

Por otra parte, cuando trabajamos con matrices es posible manipular a los vectores de una forma más natural, entendiéndose por natural la forma en la que realizamos operaciones con los vectores a lápiz y papel. Esta situación se hace evidente cuando queremos hacer transposición de vectores, por ejemplo, si aplicamos la función Transpose al vector (\(1,2,3,4)\) el vector resultante seguirá siendo columna, tal y como se muestra a continuación:
  (*Using Transpose with a vector*)
  Transpose[{1,2,3,4}]
  (*{1,2,3,4}*)
En cambio, cuando escribimos al vector (\(1,2,3,4)\) en forma matricial, sí logramos observar el cambio que hace la función Transpose, esto es
 (*Using Transpose with a matrix of dimension 4 x 1*)
 Transpose[{{1},{2},{3},{4}}]
 (*{{1,2,3,4}}*)
Usando la función MatrixForm se visualiza la operación anterior, mostrándose en el notebook así:
Es evidente que el producto de las matrices anteriores es una matriz, cuyo único elemento de matriz coincide con el producto interior del vector (\(1,2,3,4)\) consigo mismo, y que en código queda como sigue:
 (*Matrix product and inner product of vectors*)
 Transpose[{{1}, {2}, {3}, {4}}] . {{1}, {2}, {3}, {4}}
 (*{{30}}*)
 {1, 2, 3, 4} . {1, 2, 3, 4}
 (*30*)
El siguiente nivel de lista estructurada son las listas de matrices, esto es, tensores de rango mayor o igual a tres. Un ejemplo de tensor de rango tres es:
 (*Square matrix of dimension 2 x 2 using Array*)
 {{{1, 2}, {1, 2}}, {{1, 2}, {1, 2}}}
Si aplicamos MatrixForm al tensor anterior que es de rango tres se observa:
Hasta el momento, hemos mencionado rango sin hacer referencia sobre alguna función que nos permita conocerlo, pero esa función existe y es TensorRank, y en las líneas de código que siguen la usamos para determinar el rango de un vector, una matriz y una listas de matrices:
 (*Rank of tensors using TensorRank*)
 TensorRank[{1,2,3,4}]
 (*1*)
 TensorRank[{{1}, {2}, {3}, {4}}]
 (*2*)
 TensorRank[{{{1, 2}, {1, 2}}, {{1, 2}, {1, 2}}}]
 (*3*)
Esto sugiere que, en general, debe existir un identificador que clasifique en un mismo conjunto a todas estas listas con estructura, y claro que existe, esta función es TensorQ e identifica tensores de cualquier rango, siendo el resultado de su acción el mismo que el de VectorQ, MatrixQ y SquareMatrixQ, es decir, False o True.

A estas alturas ya puedes preguntarte, ¿por qué Mathematica incluye identificadores de objetos? Bien, la respuesta es sencilla, y es porque desde el punto de vista programático son útiles para el desarrollo de nuevas funciones. En futuras publicaciones esto último se verá con mayor claridad.

No hay comentarios.:

Publicar un comentario