Aprende a implementar una matriz con subíndice doble en Swift para leer y escribir valores como fila y columna, usando un array 1D por debajo. Con una estructura clara, validación de índices con assert y un mapeo matemático simple, tendrás un acceso 2D eficiente y seguro. Ideal para practicar getter, setter, subscript, print y terminator.
¿Cómo se define una matriz con subíndice doble en Swift?
Una matriz queda definida por su número de filas y columnas y un contenedor mutable para los datos. Las dimensiones son fijas, mientras que el contenido puede cambiar.
Filas y columnas inmutables: se declaran con let.
Contenido mutable: se guarda en una variable grid como array de Double.
Inicialización: se llena con ceros usando Array(repeating:count:).
Ejemplo de creación y estado inicial en 2x2: cuatro ceros organizados lógicamente en 2 filas y 2 columnas, aunque internamente sea un único array largo.
¿Qué inicializa el init y el array grid?
Repite el valor 0.0 tantas veces como filas por columnas.
Obtienes una colección “larga” que luego reinterpretas en 2D mediante el subíndice.
¿Por qué las dimensiones son inmutables y el contenido mutable?
Las dimensiones definen la estructura: no deben cambiar después.
El contenido sí puede variar al asignar con el subíndice.
¿Cómo validar índices y convertir coordenadas 2D a posición 1D?
Antes de acceder, se valida que la fila y la columna estén en rango. Esto evita accesos negativos o fuera de tamaño. Luego, se mapea la posición 2D al índice del array 1D.
¿Cómo funciona la ecuación row * columns + column?
Multiplica la fila por el ancho total y suma la columna.
Transforma coordenadas 2D en una posición lineal del grid.
¿Qué errores evita la validación previa?
Filas o columnas negativas.
Posiciones que excedan los límites.
¿Cómo leer, escribir y recorrer la matriz con subíndice doble?
El subíndice doble permite usar la sintaxis matrix[fila, columna]. Se usa assert con el mensaje “index out of range” para verificar la precondición en desarrollo. El getter devuelve el valor y el setter lo asigna en el índice lineal.
extensionMatrix{subscript(row:Int, column:Int)->Double{get{assert(indexIsValid(row: row, column: column),"index out of range")return grid[row * columns + column]}set{assert(indexIsValid(row: row, column: column),"index out of range") grid[row * columns + column]= newValue
}}}
Ejemplo de uso en 2x2: asignaciones y lectura visibles.
var matrix =Matrix(rows:2, columns:2)matrix[0,1]=1.5matrix[1,0]=2.5
Para imprimir en formato matricial, se recorre con for anidados. Se usa print sin separador y con terminator como espacio para evitar saltos de línea en cada elemento. Al final de cada fila, se hace un print vacío.
for r in0..<matrix.rows {for c in0..<matrix.columns {print(matrix[r, c], terminator:" ")}print()}
¿Qué habilidades y palabras clave practicas aquí?
Subíndice doble con subscript para acceso 2D intuitivo.
Getter y setter con uso de newValue.
Validación con assert y mensaje "index out of range".
Mapeo 2D→1D con row * columns + column.
Recorrido con for y formateo con print y terminator.
¿Te animas a extenderla con suma, resta, producto o incluso la matriz inversa cuando te sientas preparado? Comparte tus avances y dudas en los comentarios.
Dejó un Aporte sobre esta clase, sobre como pasas de la lógica bidimensional a unidimensional :3
No es complicado, aquí el compañero habla de como funciona la ecuacion. Entendiendo todo tiene sentido.
Como me frustro esta clase!! jajaja
De acuerdo, la veo y me pongo a pensar si yo ya debería ser capaz de hacer esto o simplemente es una clase a titulo informativo jaja, espero sea la segunda porque si no ...
a mi tambien! jaja
Numpy, pandas. Los invoco!
¿Te atreves? seguro que sí
Me atrevo
No sé cómo hacerlo xD
Al decir "intentar crear una matriz" lo que me imaginé fue algo como
varmatrix:[Int][Int];
o
varmatrix:[[Int]]
Estaba tan equivocado jajaja
Soy el unico que se perdio?
cuando cambie los valores a 15, me tiro un swift/contiguousArrayBuffer.swift:580: Fatal error: Index out of range
Recuerda que los array empiezan en la posición 0 por lo tanto para la matriz que se simula de 15 * 15 sus posiciones van de [0,0] a [14,14]..
Todo esto me hizo recordar Algebra Lineal de la Universidad! 👨🏼💻Creo que todo esto sera interesante para resolver problemas de matematicas con matrices.
Interesante para manejar datos.
No pude entender nada. Creo que ni eh entendido nada haya ahora 😒😒
Que bonito es lo bonito!!!
//---- Mi aporte,, funciones para sumar y miltiplicar matricesfunc sumMatrix(matrixA:Matrix,matrixB:Matrix)->Matrix{var matrixResult =Matrix(rows: matrixA.rows,columns: matrixA.columns)if matrixA.columns== matrixB.columns&& matrixA.rows== matrixB.rows{for row in0..< matrixA.rows{for col in0..< matrixB.columns{ matrixResult [row,col]= matrixA[row,col]+ matrixB[row,col]}}}else{print("The matrices are not of the same order")}return matrixResult
}func prodMatrix(matrixA:Matrix,matrixB:Matrix)->Matrix{var matrixResult =Matrix(rows: matrixA.rows,columns: matrixB.columns)if matrixA.columns== matrixB.rows{for z in0..< matrixA.rows{for y in0..< matrixB.columns{for x in0..< matrixA.columns{ matrixResult[z,y]+=(matrixA[z,x]* matrixB[x,y])}}}}else{print("The matrices cannot be multiplied ")}return matrixResult
}
Si deseas evitar iterar sobre la matriz utilizando ciclos anidados y mejorar la legibilidad del código, puedes usar el método joined de los arreglos y el método joined(separator:) de las cadenas para imprimir la matriz de una manera más concisa. Aquí tienes la versión modificada del código:
struct Matrix{var column =0var row =0var sizeColumns =2var sizeRows =2varelements:[[Int]]=[[]] mutating func addElement(_ element:Int){if(self.column== sizeColumns){print("not is posible more thann")}else{if(elements[column].count< sizeRows ){ elements[column].append(element)}else{ self.column+=1if(self.column< sizeColumns){ elements.append([]) elements[column].append(element)}else{print("not is posible more than")}}}}}
Yo modifique unas cosas en el código para que al momento de modificar o ver el valor de una “celda” de la matriz, no se haga empezando desde 0 sino desde 1, para las filas y columnas, ya que nosotros cuando queremos en una matriz el primer valor de la primer fila y la primer columna no escribimos [0,0] sino [1,1].
<struct Matrix{letrows:Intletcolumns:Intvargrid:[Double]init(rows:Int,columns:Int){ self.columns= columns
self.rows= rows
grid =Array(repeating:0.0,count: rows * columns)} func indexIsValid(row:Int,column:Int)->Bool{return row >=0&& column >=0&& row <= rows && column <= columns
}subscript(row:Int,column:Int)->Double{ get {assert(indexIsValid(row: row,column: column),"Index fuera de rango")return grid[((row -1)* columns)+(column -1)]} set {assert(indexIsValid(row: row,column: column),"Index fuera de rango") grid [((row -1)* columns)+(column -1)]= newValue
}}}var matrix =Matrix(rows:4,columns:5)matrix[1,1]=5.5matrix[4,5]=4.5for row in1... matrix.rows{for col in1... matrix.columns{print(matrix[row, col],separator:"",terminator:" ")}print(" ")}>