Introducción a las matrices 2D en C #

Las matrices bidimensionales son una colección de elementos homogéneos que se extienden sobre múltiples filas y columnas, asumiendo la forma de una matriz. A continuación se muestra un ejemplo de una matriz 2D que tiene m filas yn columnas, creando así una matriz de configuración mxn.

( a1, a2, a3, a4, …, an
b1, b2, b3, b4, …, bn
c1, c2, c3, c4, …, cn
.
.
.
m1, m2, m3, m4, …, mn )

Concepto de matrices dentadas

Una matriz dentada es una matriz de matrices. Las matrices irregulares son esencialmente matrices múltiples dentadas juntas para formar una matriz multidimensional. Una matriz dentada bidimensional puede verse así:

( ( a1, a2, a3, a4, …, an ),
( b1, b2, b3, b4, …, b20 ),
( c1, c2, c3, c4, …, c30 ),
.
.
.
( m1, m2, m3, m4, …, m25 ) )

Observe que todas las filas de una matriz irregular pueden o no contener el mismo número de elementos.

Matrices 2D verdaderas vs matrices irregulares

Las matrices irregulares son completamente diferentes a una verdadera matriz 2D desde una perspectiva de implementación. Es importante comprender cómo C # implementa tanto las matrices multidimensionales como las matrices irregulares.

Los lenguajes de programación difieren en su implementación de matrices multidimensionales. Algunos lenguajes de programación como C, C ++, C #, Fortran, etc. admiten matrices 2D reales. Si bien hay otros que simulan este comportamiento con matrices de matrices, también conocidas como matrices irregulares. Entonces, ¿cómo es una verdadera matriz bidimensional diferente de las matrices irregulares?

Las dos implementaciones de matrices multidimensionales son diferentes en términos de consumo de almacenamiento. Mientras que una verdadera matriz 2D tendría m filas de n elementos cada una, una matriz irregular podría tener m filas cada una con diferentes números de elementos. Esto conduce a un espacio mínimo desperdiciado para conjuntos de datos. Por lo tanto, la matriz dentada inferior está perfectamente bien:

int()() jagged array = ( (1, 2, 3, 4),
(5, 6, 7),
(8, 9) )

Si el mismo conjunto de datos se implementara en una verdadera matriz 2D, habría sido el siguiente:

int(, ) multiDimArray = ( 1, 2, 3, 4
5, 6, 7, 0
8, 9, 0, 0 )

Operaciones en matrices 2D en C #

Aquí, algunas operaciones en matrices 2D se muestran a continuación:

1. Construir matriz C # 2D

Veamos una forma de cómo declarar una matriz 2D en C # y otra forma de cómo no declarar una matriz 2D en C #.

¿Cómo?

Una verdadera implementación de matriz 2D en C # comienza con la declaración de matriz. Se ve a continuación:

int(, ) arr2D;
string(, ) arr2D_s;

El número de comas en la definición determina la dimensión de la matriz. Tenga en cuenta que no puede especificar el tamaño de la matriz en la declaración de la matriz. Debe hacerse durante la inicialización de una matriz.

¿Como no?

Es fácil confundirse entre las implementaciones de matrices 2D y matrices irregulares. Una declaración de matriz irregular se ve a continuación:

int()() jagged array;

2. Inicialice la matriz C # 2D

El siguiente paso es inicializar la matriz 2D que acabamos de declarar. Hay varias formas de hacerlo.

Usando el nuevo operador

arr2D = new int(2, 3); //separate initialization
string(, ) arr2D_s = new string(4, 5); //with declaration

Inicializando con valores

//without dimensions
arr2D = new int(, )((1, 2), (3, 4), (5, 6));
//with declaration
arr2D_s = new string(2, 2)((“one”, ”two”), (“three”, “four”));

Sin el nuevo operador

Int(, ) arr2D_a = ((1, 2), (3, 4), (5, 6), (7, 8));

3. Leer elementos de la matriz C # 2D

Leer un solo elemento

La siguiente operación es leer los elementos de la matriz 2D. Dado que la matriz 2D es una matriz de elementos mxn, cada elemento tiene una combinación designada de índice de fila e índice de columna. Podemos acceder a los elementos proporcionando el índice de fila y el índice de columna en el subíndice. Un ejemplo está abajo:

int(, ) arr2D_i = ((1, 2), (3, 4), (5, 6), (7, 8));
string arr2D_s = ((“one”, ”two”), (“three”, “four”));
int val_i = arr2D_i(2, 1); //returns '6'
string val_s = arr2D_s(1, 1); //returns 'four'

Nota : los índices de filas y columnas comienzan desde 0. Por lo tanto, la posición del índice (0, 0) es el primer elemento y (m-1, n-1) es el último elemento de la matriz.

Lee todos los elementos

Pero, el método anterior nos da el valor de un solo elemento en la matriz. ¿Cómo atravesamos toda la matriz para leer todos y cada uno de sus elementos? La solución simple es recorrer toda la matriz usando bucles anidados para / mientras.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < 3; i++)
(
for (int j = 0; j < 3; j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Salida

El método GetLength ()

Bueno. Pero, el ejemplo anterior funciona solo cuando conozco de antemano el número de elementos en la matriz. ¿Qué pasa si mi matriz es dinámica? ¿Cómo atravesar todos los elementos de una matriz dinámica? Aquí viene el método GetLength a nuestro rescate.

int arr2D.GetLength (0); // devuelve la primera dimensión (filas)

int arr2D.GetLength (1); // devuelve la segunda dimensión (columnas)

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
//reading all the elements through for loop
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
Console.Write(arr2D_i(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Salida

El poder de cada bucle

El ciclo for-each ejecuta un conjunto de comandos para cada elemento de la matriz. Este es un mecanismo de bucle muy potente y se recomienda su uso, ya que es más eficiente que un bucle tradicional.

Código

using System;
public class Program
(
public static void Main()
(
string(, ) arr2D_s = new string(3, 3)(("one", "two", "three"), ("four", "five", "six"), ("seven", "eight", "nine"));
//reading all the elements through foreach loop
foreach(var ele in arr2D_s)
(
Console.WriteLine(ele);
)
)
)

Salida

4. Insertar elementos en la matriz C # 2D

Ahora veamos un ejemplo sobre cómo insertar elementos en una matriz C # 2D. La idea es atravesar cada posición de la matriz y asignarle un valor.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) squares = new int(3, 3);
int(, ) cubes = new int(3, 3);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
squares(i, j) = arr2D_i(i, j) * arr2D_i(i, j);
cubes(i, j) = squares(i, j) * arr2D_i(i, j);
)
)
Console.WriteLine("Squares\n");
DisplayArray(squares);
Console.WriteLine("\n\nCubes\n");
DisplayArray(cubes);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
( Console.Write(arr(i, j) + "\t"); )
Console.WriteLine("\n");
)
)
)

Salida

5. Actualizar elementos en la matriz C # 2D

Actualizaremos nuestra matriz para multiplicar cada elemento con 2. La idea es recorrer cada posición de la matriz y actualizar el valor que contiene.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
arr2D_i(i, j) *= 2;
)
)
Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n");
DisplayArray(arr2D_i);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Salida

6. Eliminar elementos en C # 2D Array

Esta es una operación complicada. No es posible eliminar un solo elemento de una verdadera matriz C # 2D. Eliminar un solo elemento alterará las dimensiones de la matriz de modo que ya no sería una matriz. C # no permite eso a menos que sea una matriz irregular.

¿Entonces, cuál es la solución? ¿Eliminamos la fila completa o la columna completa? No, C # no permitiría eso también. La matriz tiene un tamaño fijo cuando se declara o se inicializa. Tiene bytes fijos de memoria asignados. No podemos cambiar eso en tiempo de ejecución.

La solución aquí es crear una nueva matriz sin los elementos que queremos eliminar.

Código

using System;
public class Program
(
public static void Main()
(
int(, ) arr2D_i = new int(3, 3)((1, 2, 3), (4, 5, 6), (7, 8, 9));
int(, ) new_array = new int(2, 2);
Console.WriteLine("Original Array\n");
DisplayArray(arr2D_i);
int rowToDel = 2;
int colToDel = 2;
for (int i = 0; i < arr2D_i.GetLength(0); i++)
(
if(i==rowToDel)
continue;
for (int j = 0; j < arr2D_i.GetLength(1); j++)
(
if(j==colToDel)
continue;
new_array(i, j)=arr2D_i(i, j);
)
)
Console.WriteLine("\n\nArray after deleting elements\n");
DisplayArray(new_array);
)
static void DisplayArray(int(, ) arr)
(
for (int i = 0; i < arr.GetLength(0); i++)
(
for (int j = 0; j < arr.GetLength(1); j++)
(
Console.Write(arr(i, j) + "\t");
)
Console.WriteLine("\n");
)
)
)

Salida

Conclusión

Por lo tanto, hemos visto cómo se implementa una matriz 2D en C # y cuáles son las diversas operaciones CRUD que podemos realizar en él. También aprendimos la diferencia entre una implementación 2D real y una matriz irregular. Hay muchos más métodos disponibles en C # para ayudar a los desarrolladores a trabajar con Arrays a gusto. Verifíquelos en los documentos de MSDN.

Artículos recomendados

Esta es una guía de matrices 2D en C #. Aquí discutimos el concepto de matrices irregulares junto con operaciones en matrices 2D en C #. También puede consultar los siguientes artículos para obtener más información.

  1. Matrices 2D en Java
  2. Matrices 2D en Python
  3. Matrices en C #
  4. Matrices en C ++
  5. Matrices en PHP
  6. Gráficos 2D en Java
  7. ¿Cómo funcionan las matrices y listas en Python?
  8. Matrices multidimensionales en C ++ con ejemplos
  9. Matrices 2D en PHP