Antes de marcar esto como respondido por otra pregunta , tenga en cuenta que esto es una matriz de matrices, no una matriz plana, además, el número que he dado es un ejemplo, solo los he mostrado para que pueda ver visualmente lo que está sucediendo.
Estoy tratando de recorrer una matriz de matrices. Tengo la siguiente matriz: -
[ [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [3, 2, 1, 6, 5, 4, 9, 8, 7], [6, 5, 4, 9, 8, 7, 3, 2, 1], [7, 8, 9, 3, 2, 1, 6, 5, 4] ]¿Cómo es posible transformar esta matriz en trozos de 3x3, por ejemplo: -
[ [1, 2, 3, 1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6, 4, 5, 6], [7, 8, 9, 7, 8, 9, 7, 8, 9], [3, 2, 1, 6, 5, 4, 9, 8, 7], [6, 5, 4, 9, 8, 7, 3, 2, 1], [7, 8, 9, 3, 2, 1, 6, 5, 4], ]Como puede ver en la matriz anterior, la he fragmentado usando los primeros 3 valores de cada matriz y luego el segundo 3n de cada matriz y, por último, los 3n finales de cada matriz.
Entonces, la matriz se dividiría de la siguiente manera: -
1 2 3 | 4 5 6 | 7 8 9 1 2 3 | 4 5 6 | 7 8 9 1 2 3 | 4 5 6 | 7 8 9 --------------------- 3 2 1 | 6 5 4 | 9 8 7 6 5 4 | 9 8 7 | 3 2 1 7 8 9 | 3 2 1 | 6 5 4Intenté recorrer cada línea y restablecer el recuento de columnas cuando alcanza un incremento y aumentar la fila, pero esto no funcionó.
¿Puedo actualizar la pregunta con intentos anteriores si esto es de alguna ayuda? También solo una nota, la matriz será de diferentes tamaños pero siempre divisible por un número en particular, para el ejemplo anterior he elegido el número 3.
He actualizado la pregunta con más información. La matriz de matrices siempre será divisible por un número específico, este ejemplo muestra un número divisible de 3.
Esto se puede resolver con un fragmento según esta pregunta . Divida la matriz en fragmentos combinados con un zip según esteequivalente de Javascript de la función zip de Python.
Esto tiene la ventaja de poder invertir la operación para volver al original.
/** @see: https://stackoverflow.com/questions/8495687/split-array-into-chunks */ function chunk(array, chunk) { let result = []; for (let i = 0; i < array.length; i += chunk) { result.push(array.slice(i, i + chunk)); } return result; } /** @see: https://stackoverflow.com/questions/4856717/javascript-equivalent-of-pythons-zip-function */ function zip(...rows) { return [...rows[0]].map((_, c) => rows.map((row) => row[c])); } const array = [ [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [3, 2, 1, 6, 5, 4, 9, 8, 7], [6, 5, 4, 9, 8, 7, 3, 2, 1], [7, 8, 9, 3, 2, 1, 6, 5, 4], ]; const result = chunk(array, 3) .flatMap((innerChunk) => zip(...innerChunk.map((arr) => chunk(arr, 3))) .map((arr) => arr.flat()) ); console.log(result.map((a) => a.join(', '))); // Allows the result to be reverted to the original const reversed = chunk(result, 3) .flatMap((innerChunk) => zip(...innerChunk.map((arr) => chunk(arr, 3))) .map((arr) => arr.flat()) ); console.log(reversed.map((a) => a.join(', ')));Puede hacerlo con un bucle anidado, cortando la matriz cada vez según el tamaño de la matriz externa.
const arr = [ [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9] ]; let out = []; for(let i in arr) { out.push([]);} arr.forEach((e, i) => { let scale = e.length / arr.length; for(let j in arr) { out[j] = out[j].concat(e.slice(j * scale, j * scale + scale)); } }); console.log(out);Aquí está una vez más con su matriz original antes de su edición:
const arr = [ [1, 3, 2, 5, 2, 4, 3, 6, 8], [1, 4, 3, 6, 7, 3, 6, 4, 5], [2, 4, 1, 4, 6, 3, 7, 9, 7] ]; let out = []; for(let i in arr) { out.push([]);} arr.forEach((e, i) => { let scale = e.length / arr.length; for(let j in arr) { out[j] = out[j].concat(e.slice(j * scale, j * scale + scale)); } }); console.log(out);