Векторизация MATLAB cellfun медленная при использовании дескриптора функции - PullRequest
3 голосов
/ 25 мая 2020

Я столкнулся со странной ошибкой при векторизации ячеек (версия MATLAB R2019B).

Пожалуйста, рассмотрите следующий минимальный пример, скажем, мы генерируем массив ячеек с вектором переменной длины в каждой ячейке:

N = 10000;
rng(1);
result = cell(N,1);
numConnect = randi(10, [N,1]); % randomly generated number of connected nodes
for i = 1:N
  result{i} = randi(N, [1, numConnect(i)]);
end

Теперь мы хотим ретроспективно получить numConnect, т.е. длину каждой ячейки, мы можем использовать cellfun. Согласно этой документации, в режиме обратной совместимости вы можете использовать строку как переменную func вместо дескриптора функции. Однако есть резкая c разница в производительности на локальном уровне.

tic;
nC1 = cellfun('length', result);
toc;

Это обычно дает что-то вроде

Истекшее время составляет 0,038531 секунды.

Если я изменил на @ дескриптор функции:

tic;
nC2 = cellfun(@length, result);
toc;

Тогда

Истекшее время составляет 1,041925 секунды.

нормально. Разница в 30 раз!

Интересно, эта разница в производительности - ошибка на моей локальной машине или «особенность» MATLAB cellfun?

...