在MATLAB R2013a(版本8.1)中,对NaN进行数值关系运算(大于,小于)比在非NaN上慢10倍.
>> 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.
Run Code Online (Sandbox Code Playgroud)
一些实验显示了阵列中NaNs的推进所需的时间尺度,使得所有NaN的阵列花费最长并且所有非NaN最快.Infs和非NaNs一样快.
我正在对具有大量NaN的阵列进行比较.为了解决这个减速问题,我正在用Infs替换我的数组中的NaN(例如,-Inf如果我做b> 0).这有帮助,但替换本身很慢.事实上,这只是因为我在同一阵列上做了很多这样的比较,一次性替换对整体有帮助.
所以我的问题是,有没有人有更好的想法来比较大量的NaNs?
我用的是Matlab R2014a,时间是一样的。但是,我建议执行以下操作来查看它是否有效:tic; c = isnan(b) ; 目录;
这允许将 NaN 矩阵转换为逻辑矩阵,其中“true”意味着它是 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
Run Code Online (Sandbox Code Playgroud)