在 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.
一些实验显示了阵列中NaNs的推进所需的时间尺度,使得所有NaN的阵列花费最长并且所有非NaN最快。 Infs和非NaN一样快。
我正在对具有大量NaN的数组进行比较。为了解决这个减速问题,我正在使用Infs替换我的阵列中的NaN(例如-Inf
如果我正在做b> 0)。这有帮助,但替换本身很慢。事实上,这只是因为我在同一阵列上做了很多这样的比较,一次性替换对整体有帮助。
所以我的问题是,有没有人有更好的想法来比较大量的NaN?
答案 0 :(得分:1)
我使用Matlab R2014a,时间相同。但是,我建议执行以下操作以查看它是否有效: 抽动; c = isnan(b); TOC;
这允许将NaN矩阵转换为逻辑矩阵,其中" true"意味着它是NaN。新矩阵将比旧矩阵更快,您只需重新定义您的比较。例如,如果你有一个矩阵" A"包含数字和NaN,并且您想要找到大于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