2015-11-25 13 views
10

NaNで数値的な関係演算を実行すると、非NaNよりも10倍遅くなることがわかります。MATLAB R2013a(ver 8.1)MATLABでNaN関係が遅い

>> 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. 

いくつかの実験は、すべてのNaNの配列が最長受け取り、すべての非のNaNが最速となるように、配列内のNaNのproporationとスケールを撮影した時刻を示しています。 Infsは非NaNほど速いです。

多数のNaNを持つ配列の比較を行っています。この速度をハックするために、配列のNaNをInfsで置き換えます(例:-Inf、b> 0の場合)。これは役に立ちますが、交換自体は遅いです。確かにそれは、同じアレイ上でこのような比較をしているので、一回限りの交換が全体的に役立つからです。

だから私の質問は、誰も多くのNaNと比較するための良いアイデアを持っていますか?

+2

Matlabのバージョンは?私にとっては勝利64でR2015b - 時間は同じです! – matlabgui

+0

@matlabgui:本当に!ガー、私は2013年です。それを述べるべきです(Qを編集します)! – Justin

+3

@matlabgui R2015bにはかなりの[実行エンジンのアップグレード](http://www.mathworks.com/help/matlab/release-notes.html#zmw57dd0e3251)が含まれていることは何も価値がありません。私はそれがベンチマーク[かなり最近](http://stackoverflow.com/questions/33761451/)で思い付きます。 – excaza

答えて

1

私はMatlab R2014aを使用していますが、時間は同じです。しかし、私はそれが動作するかどうかを確認するために次のことをお勧めします: tic; c = isnan(b); toc;

これにより、NaNの行列を論理行列に変換できます。ここで、「真」はNaNを意味します。新しい行列は古い行列より速くなり、単純に比較を再定義する必要があります。たとえば、数字とNaNを含む行列 "A"を持ち、0より大きい数字を探したい場合は、次のようになります。

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

これは速いと言っていますか?確かにこれはまだ遅くなります。最後の行は、Aのすべての要素について同じ完全比較を行い、次にBとANDを行います。 – Justin

+0

はい、それは遅くなりますが、あなたがNaNをたくさん持っている場合、あなたがやっていることよりも速いと思われます。 isnanの使用には、ダブル・マトリックス上での論理演算子の使用とほぼ同じ時間がかかります。 最後の行は2回の比較を行います。つまり、通常の比較の2倍の時間がかかります。 したがって、コードは遅くなりますが、完全なNaN行列の場合は2〜4倍遅くなります。これはコードよりも12倍遅くなります。 これは、大部分のNaNがある場合にのみより高速になります。 しかし、それは推測だけです。あなたのコードを実行しているとき、私のPCは同じtoc時間を与えます。 – DomDev