2010-11-06 10 views
7

Si tratta di come MATLAB può richiedere tempi molto diversi per tracciare la stessa cosa - e perché.MATLAB scatter3, discrepanze di velocità della trama3

ho generare 10000 punti nello spazio 3D:

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

Allora ho usato uno dei quattro metodi diversi per tracciare questo, per creare una trama così:

alt text

ho chiuso tutto figure e liberato lo spazio di lavoro tra ogni corsa per cercare di garantire l'equità.

plotting Bulk utilizzando scatter3:

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

individuale tracciato utilizzando 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. 

plotting Bulk utilizzando plot3:

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

individuali plottaggio utilizzando 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. 

Che cosa è che MATLAB fa dietro le quinte nel 'piu' routine di prendere così tanto tempo? Quali sono i vantaggi e gli svantaggi dell'utilizzo di ciascun metodo?

Edit: grazie ai consigli di Ben Voigt (vedi risposte), ho inserito drawnow comandi nella tempistica - ma questo ha fatto poca differenza per i tempi.

+0

fatto poca differenza? Il tempo per la massa 'plot3' è aumentato di tre ordini di grandezza! –

risposta

6

La differenza principale tra il tempo necessario per eseguire scatter3 e plot3 deriva dal fatto che viene compilato plot3, mentre viene interpretato scatter3 (come vedrete quando si modificano le funzioni). Se è stato compilato anche lo scatter3, la differenza di velocità sarebbe ridotta.

La differenza principale tra il tempo necessario per tracciare in un ciclo rispetto al tracciamento in un colpo solo è che si aggiunge la maniglia alla trama come un bambino agli assi (dare un'occhiata all'uscita di get(gca,'Children')), e si ' così facendo cresce un array complicato all'interno di un loop, che sappiamo essere lento. Inoltre, stai chiamando diverse funzioni spesso invece di una sola volta e quindi incorre in chiamate dalla funzione overhead.

Il ricalcolo dei limiti degli assi non è un problema qui. Se si esegue

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

che costringe Matlab per aggiornare il dato ad ogni iterazione (e che è molto più lento), vedrete che i limiti di assi non cambiano affatto (dal momento che il default assi limiti sono 0 e 1). Tuttavia, anche se i limiti degli assi fossero iniziati in modo diverso, non sarebbero necessarie molte iterazioni per convergere con questi dati. Paragonare omettendo lo hold on, il che rende più lungo il plottaggio, poiché gli assi vengono ricalcolati ad ogni passo.

Perché queste diverse funzioni? scatter3 consente di tracciare punti con diverse dimensioni di indicatore e colori sotto un'unica maniglia, mentre è necessario un ciclo e ottenere una maniglia per ogni punto utilizzando plot3, che non è solo costoso in termini di velocità, ma anche in termini di memoria. Tuttavia, se hai bisogno di interagire con diversi punti (o gruppi di punti) individualmente - magari vuoi aggiungere una voce separata della legenda per ciascuno, magari vuoi essere in grado di accenderli e spegnerli separatamente ecc. - usando plot3 in un ciclo potrebbe essere la soluzione migliore (anche se lenta).

+0

Grazie, questo ha chiarito i problemi relativi alle differenze di velocità, in particolare a ciò che accade dietro le quinte. –

4

Bene, se si desidera controllare il colore di ciascun punto, la dispersione di massa sarebbe più veloce, perché è necessario chiamare la trama separatamente.

Inoltre, non sono sicuro che le informazioni relative alla tempistica siano accurate perché non si è chiamato drawnow, quindi il disegno effettivo potrebbe aver luogo dopo toc.

In sintesi:

  • plot3 è più veloce perché attinge lo stesso marcatore in molti luoghi diversi
  • scatter3 attira molti marcatori differenti, in quanto dimensione e il colore del marcatore (sono autorizzati a) variare con ogni punto
  • chiamare in un ciclo è molto lento, perché l'analisi dell'argomento e così via deve avvenire ripetutamente, inoltre come punti vengono aggiunti alla trama gli assi devono essere ricalcolati
+0

Questo è molto interessante - così MATLAB trama le cose in un momento casuale dopo che sono state chiamate? Di nuovo, perché? Cosa fa MATLAB nel suo codice per causare questo? –

+0

Ora ho aggiornato i tempi sul tuo consiglio qui. Grazie. –

+0

Praticamente TUTTI i programmi GUI tracciano le cose solo quando ricevono una richiesta di disegno dal sistema operativo. Questa è davvero una cosa MOLTO buona. Ho notato che stai usando assi automatici, quindi la versione 'hold on' calcola una scala dell'asse per il primo punto, una nuova scala dell'asse quando aggiungi il punto successivo e regola gli assi di nuovo ogni volta che aggiungi un nuovo punto che non rientra nei punti precedentemente tracciati. Se reso immediatamente, dovrebbe disegnare l'asse, le zecche, i titoli, ecc centinaia di volte invece di una sola volta. O la finestra delle figure potrebbe essere minimizzata o coperta. –

6

Per un approccio più veloce, in considerazione questa terza opzione (utilizza direttamente la funzione di basso livello LINE):

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

Ecco alcuni articoli riguardanti plottaggio problemi di prestazioni:

+5

Oltre agli articoli che hai citato su UndocumentedMatlab.com, tieni presente il seguente articolo che spiega che la funzione scatter funziona in modo imprevisto quando viene richiesto di tracciare più di 100 punti dati: http: // UndocumentedMatlab.com/blog/privi di documenti-scatter-plot-comportamento / –