Медленные сравнительные сравнения NaN в MATLAB

Похоже, что числовые реляционные операции (больше, меньше чем) на NaNs в 10 раз медленнее, чем на не-NaN в MATLAB R2013a (версия 8.1).

>> 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 являются наиболее быстрыми. Infs так же быстро, как non-NaN.

Я делаю сравнения на массивах с большим количеством NaN. Чтобы взломать это замедление, я заменяю NaNs в своих массивах Infs (например, -Inf, если я делал b > 0). Это помогает, но замена сама по себе медленная. Действительно, только потому, что я делаю много таких сравнений в том же массиве, что и общая замена в целом.

Итак, мой вопрос: есть ли у кого-нибудь лучшие идеи для сравнения с множеством NaN?

Ответ 1

Я использую Matlab R2014a, и время остается прежним. Однако я предлагаю сделать следующее, чтобы узнать, работает ли оно: крестики; c = isnan (b); TOC;

Это позволяет преобразовать матрицу NaN в матрицу логической, где "истина" означает, что она является 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