En esta publicación quisiera desglosar un poco la lógica usado por el profe Juan Gabriel para construir la matriz.
Este es nuestro código:
//Matrices
structMatrix
{
let rows: Int, columns: Int
vargrid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
funcindexIsValid(row: Int, column: Int) -> Bool {
returnrow >= 0 && column >= 0 && row < rows && column < columns
}
subscript(row: Int, column: Int) -> Double
{
get{
assert(indexIsValid(row: row, column: column), "Index out of range")
returngrid[ (row * columns) + column]
}
set{
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[ (row * columns) + column] = newValue
}
}
}
Recuerda que se puede implementar una clase o estructura con subíndices. Es decir podríamos crear una estructura de datos, como nuestro propio arreglo, o un tipo de objeto como Planeta
como en el ejemplo visto en la clase de subíndices.
enumPlanet: Int
{
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
staticsubscript(n: Int) -> Planet
{
returnPlanet(rawValue: n)!
}
}
let marte = Planet[4]
marte
// Resultado: Mars
En esencia lo que hacemos es crear una estructura con las variables fila
y columna
y un arreglo unidimensional que representará la matriz. La idea es ubicar los elementos en ese arreglo, con la lógica de una matriz.
Esta es la ecuación que el profe usa para trasladar un arreglo unidimensional a uno bidimensional (o matriz):
grid[ (row * columns) + column]
Para hacerlo un poco más visual, hagamos un ejemplo:
Podemos tomar cualquier ejemplo. La posición 5 corresponde a [ 1, 1 ]. Con row = 1, columns es el número total de columnas, 4, y column = 1
1 * 4 + 1 = 5
La idea es primero ubicarte en términos de fila.
Comienzas en la primera fila. Si tu número está en la primera fila, es decir fila = 0, no necesitas bajar y necesitas moverte a la derecha, esto será la suma column
. Por ejemplo el elemento en la posición 2 corresponde a
(0 * 4) + 2 = 2
En el caso en el que el elemento se encuentre en una fila de más abajo, necesita moverse por completo en las filas anteriores a la suya. Esto se logra multiplicando row
por el número de columnas que existen en cada fila. Todas las filas tienen la misma cantidad de elementos, en este ejemplo 4. Y esto lo hará tantas veces como haya filas por recorrer.
Ejemplo: La posición [ 2, 0 ] vas a querer pasar por la fila = 0, fila = 1, y para hacerlo debes recorrer 4 posiciones por cada una. O sea 2 filas X 4 columnas. Y como al hacer esto ya estas en la posición 0 de la fila = 2, no te hace falta mover más:
(2 * 4) + 0 = 8
Ejemplo: [ 2, 3 ], recorres toda la matriz, quieres llegar a la última posición. Como son 12 plazas, será lo posición 11.
(2 * 4) + 3 = 11
Nota: Fíjate como funciona la ecuación para contar todas las posiciones desde 0, no desde 1. Cuando multiplicas la fila que quieres por las columnas totales columns
siempre estás asumiendo que la primera vez multiplicas por 0, o sea que no te mueves de fila. En la segunda fila multiplicas por 1 porque ya recorriste una fila, y así.
Espero que les sea de ayuda para entender un poco este segmento del código y para seguir entendiendo la lógica de estructuras de datos. Si tienen comentarios/sugerencias es bienvenido. Éxito en tu aprendizaje 💚
Muchas gracias