Dado un campo de bits como el siguiente (los números solo pueden ser 1 o 0):
const bits = [1, 1, 0, 1, 0, 0, 0, 1]Quiero generar una lista de N valores promedio donde N es un número arbitrario.
En nuestro ejemplo anterior, dado que N es 4, el resultado sería [1, 0.5, 0, 0.5] . (agrupe la matriz de 2 en 2 y luego calcule el número promedio de cada grupo).
Si, en cambio, N fuera 2, el resultado sería [0.75, 0.25] .
He estado usando el siguiente código hasta ahora:
const average = (...args) => args.reduce((a, b) => a + b) / args.length; const averageNumbers = Ramda.splitEvery(Math.floor(bits.length / N), bits).map(nums => average(nums)) El problema es que lo anterior no funciona en caso de que mi matriz de bits esté compuesta por 696 valores y necesito 150 números promedio, porque termino teniendo 174 números en lugar de 150.
¿Qué estoy haciendo mal?
Como se menciona en los comentarios, terminas con 174 números en lugar de 150 porque floor(696 / 150) divide el campo de bits en 174 partes de 4 bits.
Para obtener un valor aproximado para los promedios, primero puede "expandir" el campo de bits a una longitud que sea un múltiplo de N antes de tomar los promedios.
// Factor is the lowest number to expand bits by for its length to be a multiple of N const factor = lcm(bits.length, N) / bits.length; // Expand bits by the factor const expandedBits = bits.map(bit => Array(factor).fill(bit)).flat(1); const averages = splitEvery(Math.floor(expandedBits.length / N), expandedBits).map(nums => average(...nums)); // averages.length should now always be N