Saltar al contenido
Portada » Artículos » Matrices

Matrices

Vamos a pensar de una manera un poco análoga, pensemos en un almacén o contenedor de múltiples elementos similares, estos elementos son datos que representan un valor. Este contenedor se le asigna un numero máximo de espacios y por ende no puede sobrepasar ese limite. Por ello, a este tipo de contenedor se le puede definir como estático.

Tambíen las matrices son conocidas por otros nombres como vectores o arrays.

Para definir o saber que estamos trabajando con una matriz, es notando que al lado del tipo de dato se utiliza las corcheas abierta y cerrada, por ejemplo int[] eso sería una matriz de números enteros, estos elementos se pueden representar o estructurar de tres maneras:

Tipos de matrices

Matriz multidimencional

Son su declaración más básica y como dice su nombre poseen una sola dimensión, es decir solo un nivel de profundidad, en el cual, parte desde cero hasta el numero que nosotros designemos como su máximo tamaño. Para declarar y especificar la longitud de una matriz se utiliza un operador llamado new el cual se utiliza para inicializar objetos, y debido a que una matriz es un objeto en sus entrañas, así que esto funcionará. Luego del new se coloca el tipo de valor nuevamente junto a las corcheas, pero en este caso dentro de ellas el número respectivo del tamaño que tendrá dicha matriz.

float[] itemPrices = new float[10]; // Esto será una matriz de flotantes de 10 elementos
❔ El tamaño de una matriz aunque corresponda en este caso a diez, su enumeración interna o índice empieza en cero, es decir que su tamaño se extiende de [ 0 hasta 9 ].
‼ En este ejemplo todos esos valores flotantes se inicializarán en 0, debido a que es el valor por defecto de ese tipo de dato.

Matriz unidimensional

Existe la posibilidad de los multiversos, bueno, algo parecido sucede con las matrices, ellas pueden contener una cantidad más extensa de espacio formulando nuevas dimensiones que funcionan como columnas.

Matriz bidimensional

Se definen por contener una coma dentro de las corcheas que van posterior al tipo de dato, por ejemplo char[,] , esto define a que del lado izquierdo de la coma se definirán las filas y del lado derecho las columnas de esta matriz, esto solo se podrá hacer cuando asignemos a la variable su espacio con el operador new.

int[,] mapCoords = new int[10, 20]; // Esto contendría 10 filas y 20 columnas

Matriz tridimensional

Muy similar a la versión de dos dimensiones, pero con el anexo de una nueva coma dentro de los corchetes, quedando en una representación de esto [,,] , dando así la posibilidad de representar una nueva dimensión de espacio.

double[,,] targetsPositions = new double[1, 1, 3];
// Su representación seria cómo: 1 fila, 1 columna y 3 de área

Las dimensiones no paran aquí

Sí, es así, las dimensiones pueden extenderse a cuatro, cinco, seis, … pero, como todo, entre más niveles, más anidación conllevará, que se traduce en más complejidad y dificultad para recorrerlas. Para agregar más dimensiones, solo basta seguir añadiendo comas dentro de las corcheas.

Matriz escalonada

Si no hemos llegado a un nivel de complejidad alto con las matrices tridimensionales, hay más posibilidades para cubrir esta estructura y en esta ocasión se denomina también matriz de matrices o jagged arrays, y es debido a que sí, una matriz puede contener otras matrices, debido a que también las matrices son un tipo de dato, un objeto.

Para definirlas se necesita declarar dos corchetes abiertos y cerrados, uno al lado del otro luego del tipo de dato que utilizará internamente, por ejemplo string[][] . El primer corchete contempla el tamaño del contenedor que contendrá las matrices y el segundo corchete no se rellena solo especifica como es esa matriz, si unidimensional, bidimensional, tridimensional o la búsqueda en más de 7.523.217 de dimensiones.

Eso sí, luego de declarar el tamaño de nuestra matriz de matrices debemos inicializar las matrices de su contenido, accediendo a ellas individualmente y asignando su tamaño.

string[][] foodDirectory = new string[3][];

foodDirectory[0] = new string[5]; // Este seria una matriz de 5 elementos string, ubicada en la primera posición de la matriz escalonada
foodDirectory[1] = new string[3]; // Este seria una matriz de 3 elementos string, ubicada en la segunda posición de la matriz escalonada
foodDirectory[2] = new string[7]; // Este seria una matriz de 7 elementos string, ubicada en la tercera posición de la matriz escalonada

Declarando y asignando valores a las matrices

Con anterioridad ya hemos aprendido como declarar una matriz, sea cual sea, pero al no asignarle los valores a dichos contenedores, todos se asignan con su valor por defecto. Es decir, si definimos una matriz con tipo de datos de números int, float, byte o algún otro, se asignará su número por defecto que es 0, cosa que quizás no queremos que suceda siempre. Para ello existe una forma de asignar valores en la misma línea, esto se denomina como inicializadores de objetos y se define utilizando las llaves {} con su respectivo valor de dato dentro separado por coma, esto se asigna luego de especificar la palabra clave new el tipo de valor y las corcheas []. En un ejemplo quedaría más claro.

Matriz unidimensional

string[] jobNames = new string[] {"Leñador", "Médico", "Policía", "Astronauta"};
// Aquí estamos definiendo una matriz unidimensional de 4 espacios con sus valores ya establecidos

Matriz bidimensional

float[,] scoreTable = new float[,] { {5.4f, 68.9f}, {70f, 10.75f}, {69.99f, 120f} };
// Esto significaría una matríz de 3 filas y 2 columnas.

Matriz tridimensional

char[,,] codexCharacters = new char[,,] { { {'A', 'B'}, {'C', 'D'}, {'E', 'F'} }, { {'0', '1'}, {'2', '3'}, {'4', '5'} } };
// Aquí se complica un poco, debido a los niveles de anidado que hay que cubrir.
// Pero esto es una matriz tridimensional de 2 filas, 3 columnas y 2 elementos en cada columna.

Matriz escalonada

byte[][] statsTable = new byte[][] 
{
		new byte[] {5, 25, 75, 3 , 4}, // Matriz de 5 elementos
		new byte[] {78, 9, 255, 0} // Matriz de 4 elementos
};
// Y en total se hizo una matriz escalonada de 2 matrices

string[][,] directoriesRegistry = new string[][,] 
{
		new string[,] { {"Ruta 50", "Ruta 76"}, {"Kanto", "Sinnoh"}, {"Ruta 20", "Ruta 1"} }
		// Una matriz bidimensional de 3 filas y 2 columnas
};
// Y esto seria en total una matriz escalonada de 1 matriz
‼ Hay que tener en cuenta que cuando se definen diferentes matrices, justo al final de la declaración de una matriz, si vas a agregar una más debes utilizar una coma , para empezar otra nueva declaración.

Accediendo y modificando las matrices

No hay ninguna utilidad aparente si no podemos acceder a la información que estamos declarando en nuestras matrices, es como si hiciéramos un contenedor con llave 🔑 y la llave la tiramos al océano 🌊.

Obtener los valores dentro de una matriz puede ser realmente sencillo, puesto a que solo debemos saber la ubicación del dato al que queremos acceder, esto es posible mediante un índice, este elemento empieza siempre de cero hasta el numero máximo de espacio menos uno [ 0 ... n-1 ] esto es debido a que en C# en la mayor parte de su sintaxis se empieza desde el número cero.

La forma para ingresar a dicho dato es colocando el nombre de la variable y luego el operador de acceso indizador [n] dónde n será nuestro número de índice, con ello obtendremos dicho dato (si existe realmente), si utilizamos un índice que se salga del contenido de la matriz obtendremos una excepción.

Matriz unidimensional

int[] lottoNumbers = { 977, 777, 57, 42, 131, 20 }; // Es una matriz de 6 números osea su indice es de 0 hasta el 5

int myLuckyNumber = lottoNumbers[5]; // 20
// Aqui le asignamos a la variable myLuckyNumber la posición 5 de nuestra matriz que su valor es 20

Matriz bidimensional

string[,] categories = { {"Movies", "Shows"}, {"Tabletop", "Videogames"}, {"Documental", "Tutorials"} };
// Es igual que asignar un new string[1,2];

string mySelectedCategory = categories[1,1]; // "Videogames"
// Asignamos a mySelectedCategory el valor de la posición de la fila 2, columna 2
// Recordar que el indice tanto de filas como columnas empieza en cero

Matriz tridimensional

float[,,] magicNumbers = { { {0.5f}, {79f} }, { {131.2f}, {25f} } };
// Es igual que asignar un new float[2,1,1];

float myNumber = magicNumbers[1,0,0] // 131.2f
// Asignamos a myNumber el valor ubicado en la fila 2, columna 1, elemento 1
‼ Este método de acceso para las matrices multidimensionales funciona siempre de la misma manera, entre más dimensiones, tendremos que especificar más índices de profundidad.

Matriz escalonada

string[][] spellShop =
{
    new string[] { "Firebomb", "Magma Sable", "Blaze" },
    new string[] { "Frozen", "Sub-Zero" },
    new string[] { "Shock", "Thunderbolt" }
};

string selectedSpell = speelShop[1][1] // "Sub-Zero"
// Se le asigna a selectedSpell el segundo valor de la segunda matriz

Obteniendo el tamaño de una matriz

Propiedad Length

Las matrices aunque ya están definidas y quizás sepamos cuanto tamaño posee una matriz, es necesario que el programa comprenda la longitud de dicha matriz la cual dicha información servirá para iterar correctamente con los 🔄Bucles y acceder a la información de nuestras matrices. Es por ello, que hay una propiedad que poseen todas las matrices la cual se llama Length utilizándola podremos obtener el tamaño real en un valor entero int de una matriz, es decir la cantidad de elementos que posee.

int[] aLotNumbers = new int[999];
int quantityOfNumbers = aLotNumbers.Length; // Esta variable valdrá 999 que es el tamaño de elementos de la matriz

string[] movies = { "Alien", "Godfather", "Interstellar", "Fullmetal Jacket", "MIB" };
int quantityOfMovies = movies.Length; // La variable valdrá 5.
‼ No confundir Length con el ultimo índice de una matriz, debido a que los índices comienzan desde cero y especifican el lugar donde se ubica cada elemento, sin embargo la propiedad de longitud nos da un conteo humano, por así decirlo, de los elementos.

Propiedad Rank

Contiene la información de que tan extensa o profunda es una matriz, es decir en vez de contar los elementos internos que posee, cuenta en si las dimensiones que conlleva dicha matriz, en el caso de que trabajemos en una unidimensional el resultado será 1, de una bidimensional 2, y así sucesivamente, este valor se proporciona en un valor entero int.

char[,] acceptedCharacters = { {'A', 'B', 'E'}, {'3', '2', '9'}, {'$', '_', '@'} };
int acceptedDimension = acceptedCharacters.Rank;
// Asignaria el valor de 2, pues son las dimensiones de esta matriz

Método GetLength(d)

Provee la misma posibilidad que Length, pero capacitada para matrices multidimensionales, debido a que cada dimensión tiene una longitud, por ello este método facilita ese conocimiento; solo basta con especificar el índice de la dimensión (si, empezamos desde el número cero) al que queremos acceder, por ejemplo en una matriz tridimensional queremos saber el valor de la tercera segunda dimensión habría que escribir GetLength(1).

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

int OneDimensionLength = numbers3D.GetLength(0); // Asigna el valor de 2
int TwoDimensionLength = numbers3D.GetLength(1); // Asigna el valor de 2
int ThreeDimensionLength = numbers3D.GetLength(2); // Asigna el valor de 3
Etiquetas:

Deja una respuesta