Matlab `скоростной тренд 'скорости тренда? - PullRequest
0 голосов
/ 14 мая 2018

Моя организация обычно на несколько лет отстает от самой последней версии Matlab. Я обнаружил, что splitapply очень медленно, когда есть много групп (две числовые переменные группировки), что резко контрастирует с моим опытом работы с SQL. Я подозреваю, что это проходит через все группы. Какой бы ни была причина, для целей долгосрочного планирования мне было интересно, может кто-нибудь прокомментировать, является ли это проблемой в версиях Matlab после 2015 года?

Вот код для сравнения. Результаты не такие экстремальные, как для моей реальной проблемы, но они все еще показывают несоответствие во времени выполнения.

clear all

% This data is more like mine and takes splitapply 3+ minutes to run
%-------------------------------------------------------------------
% tDat = array2table( ...
%     floor([ rand(2e6,1) 20e3*rand(2e6,1) 50*rand(2e6,1) ]) , ...
%     'VariableNames' , {'data2add','groupVar1','groupVar2'} );

% This data runs way faster than mine, but still illustrates the problem
%------------------------------------------------------------------------
tDat = array2table( floor(100*rand(2e6,3)) , ...
                    'VariableNames' , ...
                    {'data2add','groupVar1','groupVar2'} );

[ G , tRollup ] = findgroups( tDat(:,{'groupVar1','groupVar2'}) );

tic
tRollup.total_sa = splitapply( @sum, tDat.data2add, G );
disp('Done splitapply')
toc
fprintf('\n')

tic
tRollup.total_aa1 = accumarray( G, tDat.data2add );
disp('Done accumarray #1')
toc
fprintf('\n')

tic
tRollup.total_aa2 = accumarray( G, tDat.data2add, [], @sum );
disp('Done accumarray #2')
toc
fprintf('\n')

% Confirm that results are equivalent

if isequal( tRollup.total_sa , tRollup.total_aa1 )
   disp('tRollup.total_sa == tRollup.total_aa1')
else
   disp('tRollup.total_sa ~= tRollup.total_aa1')
end

if isequal( tRollup.total_aa1 , tRollup.total_aa2 )
   disp('tRollup.total_aa1 == tRollup.total_aa2')
else
   disp('tRollup.total_aa1 ~= tRollup.total_aa2')
end

Вывод:

Done splitapply
Elapsed time is 2.550241 seconds.

Done accumarray #1
Elapsed time is 0.021673 seconds.

Done accumarray #2
Elapsed time is 0.020397 seconds.

tRollup.total_sa == tRollup.total_aa1
tRollup.total_aa1 == tRollup.total_aa2
...