2015-11-25 18 views
10

Es scheint, dass die Durchführung numerischer relationaler Operationen (größer als, kleiner als) auf NaNs 10 mal langsamer ist als auf nicht-NaNs in MATLAB R2013a (ver 8.1).Langsame NaN-Vergleichsvergleiche 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. 

Einige Experimente zeigt die Zeitskalen der proporation von NaNs in der Anordnung aufgenommen ist, so dass ein Array aller NaNs nimmt längste und alle nicht-NaNs ist schnellste. Infs sind so schnell wie Nicht-NaNs.

Ich mache Vergleiche auf Arrays mit einer großen Anzahl von NaNs. Um diese Verlangsamung zu hacken, ersetze ich NaNs in meinen Arrays durch Infs (z. B. -Inf, wenn ich b> 0 mache). Dies hilft, aber der Ersatz selbst ist langsam. In der Tat ist es nur, weil ich viele solcher Vergleiche auf dem gleichen Array mache, dass der einmalige Ersatz insgesamt hilft.

Also meine Frage ist, hat jemand bessere Ideen zum Vergleich gegen viele NaNs?

+2

welche Matlab-Version? für mich R2015b auf Sieg 64 -> die Zeiten sind gleich! – matlabgui

+0

@matlabgui: Wirklich ?! Gah, ich bin auf 2013a. Sollte das erwähnt haben (wird Q bearbeiten)! – Justin

+3

@matlabgui Es ist nichts wert, dass R2015b ein ziemlich signifikantes [execution engine upgrade] enthält (http://www.mathworks.com/help/matlab/release-notes.html#zmw57dd0e3251). Ich habe gesehen, dass es vor relativ kurzer Zeit ein Benchmarking gab (http://stackoverflow.com/questions/33761451/). – excaza

Antwort

1

Ich benutze Matlab R2014a, und die Zeit ist die gleiche. Ich schlage jedoch vor, Folgendes zu tun, um zu sehen, ob es funktioniert: Tic; c = Isnan (b); Toc;

Dies ermöglicht, die Matrix von NaN in eine Matrix von logisch zu transformieren, wobei "wahr" bedeutet, dass es ein NaN ist. Die neue Matrix wird schneller sein als die alte, und Sie müssen lediglich Ihren Vergleich neu definieren. Zum Beispiel, wenn Sie eine Matrix "A" mit Zahlen und NaN haben, und Sie Zahlen größer als 0 finden möchten, haben Sie:

+0

Sagst du, dass das schneller ist? Sicherlich wird das noch langsamer sein. Die letzte Zeile wird den gleichen vollständigen Vergleich für alle Elemente von A durchführen und dann mit B UND? – Justin

+0

Ja, es wird langsamer sein, aber ich vermute, dass es schneller ist als das, was Sie tun, wenn Sie viel NaN haben. Die Verwendung von Isnan benötigt ungefähr die gleiche Zeit wie die Verwendung eines logischen Operators in einer Doppelmatrix. Die letzte Zeile wird 2 Vergleiche machen, was bedeutet, dass es die doppelte Zeit eines normalen Vergleichs benötigt. Daher gab ich Ihnen einen Code, der langsamer ist, aber ~ 2-4 mal langsamer für eine vollständige NaN-Matrix, die besser ist als Ihr Code, der 12 mal langsamer ist. Es wird dann nur schneller, wenn Sie eine Mehrheit von NaN haben. Aber es ist nur Spekulation. Mein PC gibt die gleiche Zeit, wenn Sie Ihren Code ausführen. – DomDev