2012-04-12 9 views
7

Fai una semplice domanda su parfor in MATLAB. Mi piacerebbe impostare una bandiera nel mio programma per cambiare tra parfor e regolari per cicli. Fondamentalmente, ho bisogno di questa funzionalità in modo che alcune parti del mio codice possano aggiornare la grafica in una modalità di "debug", quindi quando il flag è spento, usa parfor senza aggiornamenti grafici per la velocità.Un loop PARFOR Matlab può essere attivato/disattivato a livello di programmazione?

Quindi, sto cercando qualcosa di semplice che ha questa funzionalità:

if (flag) 
    for i = 1:n 
else 
    parfor i = 1:n 
end 

    % Do loop tasks. 

    end 

Qualsiasi aiuto sarebbe molto apprezzato! Grazie!

+0

Fa riservando una dimensione del pool di 1 risolto il problema? – Mikhail

+0

Non esattamente perché Parfor limita la creazione di oggetti grafici, come i grafici. Pertanto, ogni volta che desidero questa uscita, devo modificare manualmente il codice della funzione. –

risposta

5

No, questo non è possibile. Tuttavia, se si può avvolgere il corpo del ciclo in una funzione separata, è possibile disporre di un parfor o di una chiamata for ciclo del corpo, vale a dire

if (flag) 
    parfor i=1:n 
     out(i) = loopBody(i) 
    end 
else 
    for i=1:n 
     out(i) = loopBody(i) 
    end 
end 

In alternativa, è possibile modificare il codice in modo che si hanno o parfor o for davanti al tuo loop, che è quello che spesso faccio.

+2

Se fosse il 1 ° aprile, vorrei commentare come "Vorrei che MATLAB avesse' # define's! Allora potremmo '#define LOOP parfor' o' #define LOOP for' e non avremmo questo problema! " –

+2

@ Li-aungYip: sì, sarebbe davvero conveniente. 'parfor' fa schifo per il debug. Mi aspetto che intorno a R2015a, il problema è risolto, però. – Jonas

4

Quando si chiude il pool di matlabpool close, parfor si comporta come un for e consente la gestione di tutti i grafici. Quindi devi solo chiudere il pool durante il debug.

+0

'parfor' non si comporta come' for', anche quando non esiste un pool di lavoratori. L'ordine delle iterazioni del ciclo non è garantito e possono essere eseguite in qualsiasi ordine. In genere, solo per assicurarsi di non fare affidamento su di essi nell'ordine normale, vengono effettivamente eseguiti in ordine * contrario *. –

+1

Nota che questo non è più del tutto vero - le versioni recenti di MATLAB e PCT * possono * aprire automaticamente un pool per te, quindi potresti aver bisogno di usare il numero opzionale di argomenti worker su 'parfor' come da mia risposta. – Edric

5

Un'altra opzione - utilizzare l'argomento opzionale per PARFOR

if flag 
    arg = Inf; 
else 
    arg = 0; 
end 
parfor (idx = 1:n, arg) 
    ... 
end