Matrices escalonadas o "jagged arrays"

En mi anterior post hablaba sobre cómo definir matrices multidimensionales en .NET. Lo cierto es que hay una forma alternativa de hacerlo que tiene ventajas de rendimiento y de características y que está totalmente soportada por el compilador: las matrices escalonadas.


Entre otras cosas cambia la sintaxis y además nos permite definir matrices multidimensionales con diferentes tamaños en cada dimensión (en el modo normal son matrices rectangulares).


Estas matrices escalonadas son verdaderamente «matrices de matrices», tal y como comentñe en el post anterior.

Estas matrices én realidad sólo tienen una dimensión y cada elemento de las mismas es una matriz. Realmente lo que se hace es definir una matriz lineal normal y a cada elemento asignarle a su vez otra matriz, así por ejemplo:


Dim jArr As Integer()() = {
New Integer() {1, 2, 3, 4}, _
New Integer() {5, 6, 7}, _
New Integer() {8, 9}, _
New Integer() {10, 11, 12}, _
New Integer() {13}
}

De esta forma defines una verdadera matriz de matrices. Así, cada fila como se puede ver tiene diferente tamaño (la primera 4 elementos, la segunda 3, la tercera 2, la cuarta 3 y la quinta sólo 1).

Es importante fijarse en cómo se han definido dos paréntesis para acceder a los elementos, y no uno separado por comas como estamos acostumbrados. Ahora para acceder a un elemento escribiríamos:



Console.WriteLine( jArr(1)(2) )


que en este caso devuelve el tercer elemento de la segunda fila, o sea, un 7.


Espero que os resulte útil.

Sin categoría

4 thoughts on “Matrices escalonadas o "jagged arrays"

  1. Cierto, es que como esto viene de una pregunta de un curso de campusMVP (http://www.campusmvp.com) y en concreto el alumno era de VB, pues me dejé llevar.

    En C# sería casi idéntico:

    int[][] jArr = {
    new int[] {1, 2, 3, 4},
    new int[] {5, 6, 7},
    new int[] {8, 9},
    new int[] {10, 11, 12},
    new int[] {13}
    };

    Saludos!

    JM

  2. Muy buen artículo José, muy clara la explicación y ambas implementaciones.

    Tan sólo por curiosidad, respecto al título del post, ¿la denominación «matriz escalonada» para jagged arrays está documentada en algún sitio? Al ver el título del post en la página de inicio de Geeks me he sobresaltado un poco, el concepto de matriz escalonada en Algebra es otro diferente al que expones aquí, y su cálculo constituye un problema clásico muy utilizado para la resolución de sistemas de N ecuaciones con N incógnitas. ¿Quién no se ha enfrentado alguna vez con el método de eliminación de Gauss-Jordan para este fin, bien en el instituto o en primeros cursos de carrera? (de Ingeniería Informática, tan menospreciada hoy en día…)

    Si a la complejidad de ese algoritmo para matrices de dos dimensiones (complejidad de N^3 para una matriz de NxN) añadimos el concepto de multidimensionalidad del que hablas al comienzo del post, el algoritmo puede complicarse «un poco». Algo así como un Sudoku N-Dimensional (con N estrictamente mayor que 2)… Creo que sería un gran reto, además paralelizable, tan de moda últimamente… 🙂

    No sé si habrá alguna forma estandarizada para traducir «jagged arrays» al castellano, pero desde luego no puede ser matriz escalonada, jeje. Jagged como tal, significa «dentado» (como una sierra), matriz multidimensional… dentada? balanceada? irregular? de dimensiones arbitrarias? Personalmente, me gusta el término «balanceada», aunque es más propio de las estructuras de árbol, pero en lugar de hablar de número de niveles de cada rama del árbol, hablaremos de magnitud en cada dimensión de la matriz.

    Un saludo,
    Miguel

  3. Miguel:

    gracias por la aportación.

    Lo cierto es que la denomincación es mía. Ya he acuñado algún término que otro : por ejemplo, lo de «event bubbling» me horroriza como se suele traducir (burbujeo de eventos) así que en mi primer libro de programación Web allá por el 1997 lo traduje por «convergencia de eventos» y ya lo he visto utilizado por ahí en más de una ocasión.

    En este caso el término me lo he inventado pero creo que refleja bien cómo son este tipo de matrices. Lo de dentadas no me gusta y me parece más claro lo de escalonada. En matemáticas tiene otra acepción (yo no hice ing. informática, sino ing. industrial pero vamos…) que creo que no se confunde en absoluto con esta en este ámbito.

    De los que tú propones el que más me gusta es el de «irregular», pero sigo pensando que escalonada encaja más.

    Aquí me gustaría conocer la opinión del maestro Octavio, que seguro que tiene una opinión precisa y certera sobre el tema.

    Saludos!

    JM

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *