Pregunta

Esto es acerca de cómo MATLAB puede tomar muy en diferentes momentos para trazar la misma cosa -. Y por qué

genero 10000 puntos en el espacio 3D:

X = rand(10000, 1);
Y = rand(10000, 1);
Z = rand(10000, 1);

I a continuación, que se utiliza de cuatro métodos diferentes para trazar este, para crear una trama de este modo:

text alt

cerró todas las figuras y se aclaró el espacio de trabajo entre cada ejecución para tratar de asegurar la equidad.

Bulk trazado usando scatter3:

>> tic; scatter3(X, Y, Z); drawnow; toc
Elapsed time is 0.815450 seconds.

trazado individual usando scatter3:

>> tic; hold on;
for i = 1:10000
    scatter3(X(i), Y(i), Z(i), 'b');
end
hold off; drawnow; toc
Elapsed time is 51.469547 seconds.

Bulk trazado usando Plot3:

>> tic; plot3(X, Y, Z, 'o'); drawnow; toc
Elapsed time is 0.153480 seconds.

trazado individual usando Plot3:

>> tic; hold on
for i = 1:10000
    plot3(X(i), Y(i), Z(i), 'o');
end
drawnow; toc
Elapsed time is 5.854662 seconds.

¿Qué es lo que hace MATLAB detrás de las escenas en las rutinas más largas '' para tomar tanto tiempo? ¿Cuáles son las ventajas y desventajas del uso de cada método?

Editar Gracias a los consejos de Ben Voigt (ver las respuestas), he incluido comandos drawnow en el tiempo -. Pero esto ha hecho poca diferencia a los tiempos

¿Fue útil?

Solución

La principal diferencia entre el tiempo necesario para ejecutar scatter3 y plot3 viene del hecho de que plot3 se compila, mientras scatter3 se interpreta (como se verá cuando se modifican las funciones). Si scatter3 fue compilado, así, la diferencia de velocidad sería pequeño.

La principal diferencia entre el tiempo necesario para trazar en un bucle en comparación con el trazado de una sola vez es que se agrega el identificador de la trama como un niño a los ejes (echar un vistazo a la salida de get(gca,'Children')), y ya está creciendo así un conjunto complicado dentro de un bucle, que todos sabemos que es lento. Por otra parte, está llamando varias funciones a menudo en lugar de una sola vez y por lo tanto incurrir llamadas de la sobrecarga de funciones.

Nuevo cálculo de los límites de los ejes no son un problema aquí. Si ejecuta

for i = 1:10000
    plot3(X(i), Y(i), Z(i), 'o');
    drawnow;
end

Matlab que obliga a actualizar la cifra en cada iteración (y que es mucho más lento), se verá que los límites de los ejes no cambian en absoluto (ya que los límites de ejes por defecto son 0 y 1). Sin embargo, incluso si los límites ejes comenzaron a cabo de manera diferente, sería no tomar muchas iteraciones para que puedan converger con estos datos. Comparar con la omisión de la hold on, lo que hace que el trazado de tomar más tiempo, debido ejes se vuelven a calcular en cada paso.

¿Por qué tienen estas diferentes funciones? scatter3 le permite dibujar puntos de diferentes tamaños y colores de marcador en una sola asa, mientras que había necesidad de un bucle y obtener un identificador para cada punto usando plot3, que no sólo es costosa en términos de velocidad, sino también en términos de memoria. Sin embargo, si usted necesita para interactuar con diferentes puntos (o grupos de puntos) de forma individual - tal vez usted quiere añadir una entrada de la leyenda separada para cada uno, tal vez usted quiere ser capaz de convertirlos y desconectar por separado, etc - con ayuda de plot3 en un bucle puede ser la mejor (aunque lento) solución.

Otros consejos

Para un enfoque más rápido, tenga en cuenta esta tercera opción (utiliza directamente la función de línea de bajo nivel):

line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)

Aquí están algunos artículos que tratan los problemas de rendimiento trazado:

Bueno, si usted quiere control sobre el color de cada punto, de dispersión mayor sería más rápido, debido a que había necesidad de llamar parcela por separado.

Además, no estoy seguro de que su información de tiempo es exacto, porque no ha llamado drawnow, por lo que el dibujo real podría tener lugar después de toc.

En resumen:

  • plot3 es más rápido, ya que dibuja el mismo marcador en muchos lugares diferentes
  • scatter3 atrae a muchos marcadores diferentes, ya que el tamaño y el color del marcador (se les permite) variará con cada punto
  • llamar en un bucle es muy lento, debido análisis de argumentos y así sucesivamente que tener lugar en varias ocasiones, además de que se añaden puntos a la trama de los ejes que volver a calcular
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top