2015-11-25 15 views
10

Sembra che eseguire operazioni relazionali numeriche (maggiore di, minore di) su NaN sia 10 volte più lento rispetto a non NaN in MATLAB R2013a (versione 8.1).Confronto relazionale lento NaN in MATLAB

>> a = rand(10000); 
>> b = NaN(size(a)); 

>> tic; a>0; toc 
Elapsed time is 0.083838 seconds. 

>> tic; b>0; toc 
Elapsed time is 0.991742 seconds. 

Alcuni esperimenti mostra il tempo impiegato scale con la proporation di NaN nella matrice, in modo tale che una matrice di tutti NaNs prende lunga e tutte non NaNs è più rapido. Gli inf sono veloci quanto i non-NaN.

Sto facendo confronti su array con un gran numero di NaN. Per rallentare questo rallentamento, sto sostituendo i NaN nei miei array con Infs (ad esempio -Inf se stavo facendo b> 0). Questo aiuta, ma la sostituzione stessa è lenta. Effettivamente è solo perché sto facendo molti confronti simili sullo stesso array che la sostituzione one-off aiuta nel complesso.

Quindi la mia domanda è: qualcuno ha qualche idea migliore per confrontarsi con molti NaN?

+2

quale versione Matlab? per me R2015b su win 64 -> i tempi sono gli stessi! – matlabgui

+0

@matlabgui: Davvero ?! Gah, sono nel 2013a. Avrei dovuto dirlo (modificherò Q)! – Justin

+3

@matlabgui Non vale nulla che R2015b contenga un [upgrade del motore di esecuzione] piuttosto significativo (http://www.mathworks.com/help/matlab/release-notes.html#zmw57dd0e3251). L'ho visto arrivare con benchmarking [abbastanza recentemente] (http://stackoverflow.com/questions/33761451/). – excaza

risposta

1

Sto usando Matlab R2014a e l'ora è la stessa. Tuttavia, suggerisco di fare quanto segue per vedere se funziona: tic; c = isnan (b); toc;

Ciò consente di trasformare la matrice di NaN in una matrice di logica, dove "true" significa che è un NaN. La nuova matrice sarà più veloce di quella vecchia e dovrai semplicemente ridefinire il tuo confronto. Ad esempio, se si dispone di una matrice "A" contenente numeri e NaN e si desidera trovare numeri maggiori di 0, si avrà:

A = myMatrix; 

% The inverse sign "~" means that "true" is a number, while "false" is a nan 
B = ~isnan(A); 

% Greater than 0 for non-nan 
C = B & A>0 
+0

Stai dicendo che questo è più veloce? Sicuramente questo sarà ancora più lento. L'ultima riga farà lo stesso confronto completo su tutti gli elementi di A e poi su AND con B? – Justin

+0

Sì, sarà più lento, ma ho il sospetto che sia più veloce di quello che stai facendo se hai un sacco di NaN. L'uso di isnan impiega all'incirca lo stesso tempo di un operatore logico su una doppia matrice. L'ultima riga effettuerà 2 confronti, il che significa che impiegherà il doppio del tempo di un confronto normale. Pertanto, ti ho dato un codice che è più lento, ma ~ 2-4 volte più lento per una matrice NaN completa, che è migliore del tuo codice che è 12 volte più lento. Sarà quindi più veloce solo se hai una maggioranza di NaN. Ma è solo speculazione. Il mio PC dà lo stesso tempo di avvio durante l'esecuzione del codice. – DomDev

Problemi correlati