2013-04-22 11 views
9

Qual è la migliore, utilizzando tutte le funzioni (*funarrayfun, cellfun, structfun e spfun) o semplicemente utilizzando for ciclo?Matlab: arrayfun, cellfun, spfun e structfun vs. semplice ciclo for

Quale metodo offre prestazioni migliori e quali metodi devono essere considerati migliori pratiche in termini di leggibilità del codice?

+4

questione connessa: [arrayfun può essere significativamente più lento di un ciclo esplicito in MATLAB. Perché?] (Http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why) –

+2

ha anche una relazione [risposta] (http://stackoverflow.com/a/15181321/1714410) – Shai

+0

Direi che dipende molto da quale versione di MATLAB si sta verificando. Nel mio caso, MATLAB R2012a, sto facendo uso di quasi solo cicli 'for' – fpe

risposta

16

Dipende molto da quello che si chiama 'prestazioni' :)

Se vuoi dire tempo minimo di esecuzione, bene, a volte *fun sono più veloci (ad esempio, cellfun('isempty', ...); (sì, argomento stringa!) Per certo batte la versione loop). A volte un ciclo è più veloce. Se sei su una versione Matlab < 2006, vai per le funzioni *fun per impostazione predefinita. Se fai qualcosa di più recente, vai per i loop di default. Dovrai sempre avere un profilo per scoprire quale è più veloce.

Come notato da Amro, se si dispone di una GPU in grado di fare FP aritmetica, e una versione recente di Matlab che supporta GPGPU, quindi una chiamata a arrayfun per gpuArray ingressi sarà massicciamente-parallelizzato. Tuttavia, nessuna dichiarazione generale può essere fatta riguardo al tempo di esecuzione; per gli array più piccoli, o assolutamente humungous, il sovraccarico di copiare tutto sulla GPU potrebbe annullare qualsiasi vantaggio nel parallelizzare i calcoli, quindi ... il profiling è davvero l'unico modo per saperlo con certezza.

Se intendi tempo di codifica minimo, allora direi che di solito è più veloce codificare in termini di *fun finché le operazioni sono semplici. Per qualcosa di complesso, di solito è meglio andare per il ciclo.

Se vuoi dire ottimale leggibilità e quindi tempo minimo necessario per la manutenzione e l'implementazione di cambiamenti in un contesto professionale, di sicuro, andare per il ciclo.

A questo punto nel tempo, non c'è davvero una risposta semplice chiara alla sua domanda :)