Question

est sur la façon dont Matlab peut prendre des temps très différents pour tracer la même chose -. Et pourquoi

je générer 10000 points dans l'espace 3D:

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

J'ai ensuite utilisé l'une des quatre méthodes différentes pour tracer cela, pour créer une parcelle comme ceci:

text alt

Je fermé tous les chiffres et effacé l'espace de travail entre chaque course pour essayer d'assurer l'équité.

en vrac de traçage à l'aide scatter3:

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

individuel tracé en utilisant 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.

en vrac de traçage à l'aide plot3:

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

individuel tracé en utilisant 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'est-ce qui fait Matlab dans les coulisses dans les routines « plus » pour prendre si longtemps? Quels sont les avantages et les inconvénients de l'utilisation de chaque méthode?

Edit: Merci à des conseils de Ben Voigt (voir les réponses), j'ai inclus les commandes drawnow dans le temps -. Mais cela a fait peu de différence aux temps

Était-ce utile?

La solution

La principale différence entre le temps nécessaire pour exécuter scatter3 et plot3 vient du fait que plot3 est compilé, alors que scatter3 est interprété (comme vous le verrez lorsque vous modifiez les fonctions). Si scatter3 a été compilé ainsi, la différence de vitesse serait faible.

La principale différence entre le temps nécessaire à tracer dans une boucle en fonction de traçage en une seule fois est que vous ajoutez la poignée à l'intrigue comme un enfant aux axes (un coup d'oeil à la sortie de get(gca,'Children')), et vous êtes augmentant ainsi une matrice compliquée dans une boucle, que nous savons tous d'être lent. De plus, vous appelez plusieurs fonctions souvent au lieu d'une fois et d'engager des appels ainsi de la surcharge de fonction.

recalcul des limites d'axes ne sont pas un problème ici. Si vous exécutez

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

qui oblige Matlab mettre à jour la figure à chaque itération (et qui est beaucoup plus lent), vous verrez que les limites des axes ne changent pas du tout (puisque les limites des axes par défaut sont 0 et 1). Cependant, même si les limites des axes ont commencé différemment, il ne prendrait pas beaucoup d'itérations pour les faire converger avec ces données. Comparer avec omettant le hold on, ce qui rend tracé plus long, car les axes sont recalculés à chaque étape.

Pourquoi ces différentes fonctions? scatter3 vous permet de tracer des points avec différentes tailles de marqueurs et couleurs sous une seule poignée, alors que vous auriez besoin d'une boucle et obtenir une poignée pour chaque point à l'aide plot3, qui est non seulement coûteuse en termes de vitesse, mais aussi en termes de Mémoire. Toutefois, si vous avez besoin d'interagir avec différents points (ou groupes de points) individuellement - peut-être vous voulez ajouter une entrée de légende distincte pour chacun, peut-être vous voulez être en mesure de les activer et désactiver séparément etc - en utilisant plot3 dans une boucle peut être la meilleure (bien que lente) solution.

Autres conseils

Pour une approche plus rapide, considérer cette troisième option (utilise directement la fonction de bas niveau ligne):

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

Voici quelques articles traitant de traçage des problèmes de performance:

Eh bien, si vous voulez le contrôle de la couleur de chaque point, la diffusion en vrac serait plus rapide, parce que vous auriez besoin d'appeler parcelle séparément.

En outre, je ne suis pas sûr que vos informations de synchronisation est exacte parce que vous ne l'avez pas appelé drawnow, de sorte que le dessin réel pourrait avoir lieu après toc.

En résumé:

  • plot3 est le plus rapide, car il dessine le même marqueur à différents endroits
  • scatter3 attire de nombreux marqueurs différents, étant donné que la taille et la couleur du marqueur (sont autorisés à) varient avec chaque point
  • appelant dans une boucle est vraiment lent, parce que l'argument de l'analyse et ainsi de suite doivent avoir lieu à plusieurs reprises, en plus de points sont ajoutés au tracé les axes doivent être recalculées
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top