3.4 Estructuras multidimensionales: matrices como listas de listas

1

Representación de matrices mediante listas anidadas

En Python estándar, una matriz bidimensional se modela como una lista cuyos elementos son a su vez listas que representan filas:

$$\text{M} = [[a_{11}, a_{12}], [a_{21}, a_{22}]]$$
Ejemplo:

Definimos una matriz de rigidez para un nanohilo bidimensional:

$$\text{K} = [[4.0, -1.0], [-1.0, 4.0]] \quad \longrightarrow \quad \text{K}[0][1] = -1.0$$
2

Creación e inicialización defensiva de matrices

Para inicializar una matriz con ceros de dimensiones $m \times n$, se debe evitar la multiplicación superficial de listas:

$$\text{M} = [[0.0 \text{ for } _ \text{ in range}(n)] \text{ for } _ \text{ in range}(m)]$$
Ejemplo:

El error canónico [[0]*n]*m replica la misma lista en memoria provocando mutaciones simultáneas no deseadas:

$$\text{peligro = [[0.0]*3]*3; peligro[0][0] = 5.0} \longrightarrow \text{Modifica las tres filas simultáneamente.}$$
3

Recorrido bidimensional sistemático por filas y columnas

Para operar sobre cada punto de una malla espacial se utilizan bucles for anidados:

$$\text{for i in range(len(M)): for j in range(len(M[i])): procesar(M[i][j])}$$
Ejemplo:

Calculamos la suma total de energía acumulada en una celda de simulación:

$$\text{energia_total = sum(sum(fila) for fila in M)}$$
4

Comprensión de listas anidadas para transformaciones matriciales

Permite aplicar filtros o reestructuraciones algebraicas en una sola línea compacta:

$$\text{transpuesta} = [[\text{fila}[i] \text{ for fila in M}] \text{ for } i \text{ in range(len(M[0]))}]$$
Ejemplo:

Multiplicamos toda una matriz por un factor escalar de calibración:

$$\text{escalada} = [[x * 1.5 \text{ for } x \text{ in fila}] \text{ for fila in M}]$$
Ejemplo 1: Extracción de la diagonal principal
$$\text{M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]}$$
$$\text{diagonal = [M[i][i] for i in range(len(M))]} \longrightarrow [1, 5, 9]$$
Ejemplo 2: Detección del valor pico en un mapa topográfico
$$\text{mapa = [[12.1, 14.5], [19.8, 11.2]]}$$
$$\text{pico = max(max(fila) for fila in mapa)} \longrightarrow 19.8\,\text{nm}$$
Ejemplo 3: Inicialización de la matriz identidad
$$\text{def identidad(n): return [[1.0 if i == j else 0.0 for j in range(n)] for i in range(n)]}$$
$$\text{print(identidad(2))} \longrightarrow [[1.0, 0.0], [0.0, 1.0]]$$
Ejemplo 4: Comprobación de simetría $M = M^T$
$$\text{def es_simetrica(M): n = len(M); return all(M[i][j] == M[j][i] for i in range(n) for j in range(i+1, n))}$$
$$\text{print(es_simetrica([[2, 1], [1, 5]]))} \longrightarrow \text{True}$$
Ejemplo 5: Aplanado de una matriz a vector unidimensional
$$\text{M = [[1, 2], [3, 4]]}$$
$$\text{vector = [x for fila in M for x in fila]} \longrightarrow [1, 2, 3, 4]$$