matlab - BSXFUN en la eficiencia de la memoria con operaciones relacionales
memory memory-management (1)
Introducción y configuración de prueba
Para realizar pruebas de memoria para preguntar sobre los puntos planteados en la pregunta, definamos las entradas A
y B
:
A = rand(M,N)
B = rand(1,N)
Aquí, M
y N
son los parámetros de tamaño y se mantienen como números realmente grandes.
Utilizaría repmat
para las comparaciones, ya que parece ser la alternativa más cercana a bsxfun
. Entonces, la idea aquí es ejecutar los códigos equivalentes bsxfun
y repmat
y tener cuidado con los baches en los usos de memoria del Administrador de tareas (en Windows).
Esta solución que comparó bsxfun
y repmat
para la eficiencia del tiempo de ejecución llevó a la conclusión de que el uso de operaciones relacionales con bsxfun
es enormemente eficiente en el tiempo de ejecución, por lo que sería interesante ampliar la base de memory efficiency
de la memory efficiency
a las comparaciones.
Por lo tanto, los equivalentes bsxfun
y repmat
verían como estos:
REPMAT version: A == repmat(B,size(A,1),1)
BSXFUN version: bsxfun(@eq,A,B))
Resultados
Al ejecutar los repmat
y bsxfun
, el Administrador de tareas de Windows mostró algo así con la primera protuberancia que denota la ejecución de repmat
y la siguiente es para bsxfun
,
El repmat
bump tiene la misma altura que cuando se crea una copia real de A
Esto básicamente muestra que repmat
hace una replicación real de B
y luego realiza la comprobación de igualdad. Como B
debe replicarse en una matriz de coma flotante más grande, los requisitos de memoria son enormes, como se demostró anteriormente en el gráfico de memoria. Por otro lado, con bsxfun
, desde su altura de bache , parece que no está replicando los valores reales de punto flotante y eso conduce a un uso eficiente de la memoria.
Ahora, después de convertir tanto A
como B
en matrices lógicas, los baches de uso de memoria cambiaron a esto:
Por lo tanto, sugiere que repmat
fue capaz de optimizar la memoria, ya que esta vez la replicación era de tipo de datos lógicos.
Uso de funciones anónimas con bsxfun
: se puede experimentar un poco con el uso de funciones anónimas con bsxfun
y ver si MATLAB muestra la misma inteligencia con él en la optimización de los requisitos de memoria que con el built-in.
Entonces, bsxfun(@eq,A,B)
podría ser reemplazado por bsxfun(@(k1,k2) k1==k2,A,B)
. El uso de memoria resultante con esta implementación de función incorporada y anónima cuando se operaba en matrices de entrada de coma flotante, dio como resultado un gráfico de memoria como se muestra a continuación:
El gráfico indica que el uso de la función anónima mantiene la eficiencia de la memoria como con la función incorporada, a pesar de que el tiempo de ejecución se ve obstaculizado bastante. Los resultados de la prueba fueron similares cuando se usaron otras operaciones relacionales en su lugar.
Conclusiones
Cuando se trabaja con operaciones relacionales en matrices de coma flotante, es definitivamente preferible usar bsxfun
sobre repmat
para el tiempo de ejecución y la eficiencia de la memoria. Entonces, ¡esto demuestra que hay más razones para ir con bsxfun
!
Hay principalmente dos cosas sobre las que me gustaría investigar:
Hay seis operaciones relacionales incorporadas para usar con
bsxfun
:@eq (equal)
,@ne (not-equal)
,@lt (less-than)
,@le (less-than or equal)
,@gt (greater-than)
y@ge (greater-than or equal)
. Muchas veces los usamos en números de punto flotante y al ser operaciones relacionales, generan matrices lógicas. Por lo tanto, me dio curiosidad, si la expansión inherente conbsxfun
al usar estas operaciones relacionales en números de coma flotante implica la replicación real de los elementos de entrada y esa es precisamente mi primera pregunta.También me gustaría saber cómo se traduce este problema de eficiencia de memoria a las
anonymous functions
cuando se usa conbsxfun
, nuevamente con el caso de las operaciones relacionales.
Esto está inspirado en las pruebas de runtime/speedup
realizadas para Comparing BSXFUN and REPMAT
.