Я столкнулся со странной ошибкой при векторизации ячеек (версия 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
?