Definición de matrices multidimensionales en .NET

Este post sale, como el anterior, de una pregunta concreta que me ha hecho un alumno en campusMVP. La cuestión viene acerca de cómo se definen las matrices de varias dimensiones en .NET, lo cual es válido tanto para VB como para C#.


La clave está en que se debe pensar en las matrices de más de una dimensión como en «Matrices de matrices», y así se entiende mucho mejor.


Por ejemplo, si quieres utilizar coordenadas de 3 dimensiones del estilo de (x,y,z) realmente no te hace falta una matriz tridimensional, ya que puedes guardarla en una de dos dimensiones si piensas en lo he dicho de «matrices de matrices». Así, por ejemplo para guardar coordenadas como las anteriores puedes escribir:


int[,] arr1 = { {1,2,3}, {4,5,6} };

Es decir, aunque tus «ristras» de datos tengan tres elementos debes usar sólo dos dimensiones porque lo que obtienes es una matriz que contiene en cada fila a otras matrices, así que con la primera dimensión indicas la fila y con la segunda la columna, así:


Console.WriteLine( arr1[0,1] );

Así lo que consigues es una matriz bidimensional pero cuyas filas tienen tres elementos, es decir, una matriz en este caso de dos filas y tres columnas:



1   2   3
4   5   6


Al coger el elemento (0,1) estás indicando que te de el segundo elemento de la primera fila (recuerda que están basadas en cero), es decir, el número 2, pero si pidieras el (1,2) te devolvería el 6 (tercer elemento de la segunda fila).


Si quieres definir una matriz tridimensional tendrías que definir una «matriz de matrices de matrices», es decir, tendrías que hacer un doble anidamiento. Por ejemplo, puedes definir una matriz 3D así:

        int[,,] arr2 = {
            { {1,2,3}, {4,5,6} },
            { {7,8,9}, {10,11,12} }
            };
        
        Console.WriteLine( arr2[0,1,1] );

Esto devolvería el número 5 ya que coges la primera matriz de matrices, dentro de ésta coges la segunda matriz y dentro de ésta el segundo elemento.


Estos conceptos serían exactamente los mismos en VB, con una definición de matrices prácticamente idéntica:


Dim arr1(,) As Integer = { {1,2,3}, {4,5,6} }
Console.WriteLine( arr1(0,1) )
Dim arr2(,,) As Integer = _
{ _
{ {1,2,3}, {4,5,6} }, _
{ {7,8,9}, {10,11,12} } _
}
Console.WriteLine( arr2(0,1,1) )

Espero que os resulte útil.

Sin categoría

3 thoughts on “Definición de matrices multidimensionales en .NET

  1. De hecho, Jose, creo que es buen momento para comentar que no solo es buena idea pensar en los arrays multidimensionales como arrays de arrays, sino sustituirlos por verdaderos arrays de arrays (jagged arrays).

    El motivo es el rendimiento. La única desventaja es que los arrays de arrays no son «CLR Compliant»… pero siempre que no se expongan en métodos públicos no hay problema.

    Incluso hay una regla de FxCop que lo advierte:
    http://msdn.microsoft.com/en-us/library/ms182277(VS.80).aspx

    ¡Un saludo!

  2. De acuerdo contigo Rodrigo. De hecho tenía pensado meter un post mañana o pasado sobre este tipo de matrices escalinadas o Jagged que seguro que viene bien como recordatorio 🙂

    Saludos

    JM

Deja un comentario

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