Поскольку вам нужна анимация, нет альтернативы использованию drawnow
для обновления фрейма. Тем не менее, это не drawnow
, в частности, что замедляет вас - профилировщик может вводить в заблуждение ... drawnow
просто обновляет все графические изменения с момента последнего перерисовки, что в вашем случае представляет собой десяток новых графиков!
Вы обнаружите, что hold
довольно медленно. Например, если вам известно о вашем владении, удалите существующий hold on
и удерживайте его только при фактическом построении
% ... above code the same but without 'hold on'
for p = 1:4
hold(hh1(p), 'on');
% plots
hold(hh1(p), 'off');
end
Это экономит ~ 10% времени на моем ПК (от 12,3 с до 11,3 с).
Реальное ускорение происходит от полного удаления hold
вместе со всеми отдельными plot
вызовами! Этот метод также не затрагивает форматирование строки, которое поможет со скоростью. Смотрите предыдущий вопрос об обновлении данных графика здесь .
Просто обновите данные графика вместо добавления графиков . Это дает мне ускорение на ~ 68% (12,3 с до 4,0 с).
% ... your same setup
% Initialise plot data
x = randn(4,300);
z = randn(4,300);
x_est = randn(4,300);
plts = cell(4,3);
hh1 = cell(4,1);
% Loop over subplots and initialise plot lines
for p = 1:4
hh1{p}=subplot(2,2,p);
xlabel('$t$',options2{:});
ylabel(ylabels{p},options2{:});
title(state{p},options1{:})
xlim([0 maxT])
% Hold on to make 3 plots. Create initial points and set line styles.
% Store the plots in a cell array for later reference.
hold on
plts{p,1} = plot(hh1{p},1:2,x(p,1:2),'b','linewidth',2);
plts{p,2} = plot(hh1{p},1:2,z(p,1:2),'m');
plts{p,3} = plot(hh1{p},1:2,x_est(p,1:2),':k','linewidth',2);
hold off
end
% March through time. No replotting required, just update XData and YData
for k = 2:maxT
for p = 1:4
set(plts{p,1}, 'XData', 1:k, 'YData', x(p,1:k) );
set(plts{p,2}, 'XData', 1:k, 'YData', z(p,1:k) );
set(plts{p,3}, 'XData', 1:k, 'YData', x_est(p,1:k) );
end
drawnow;
end
Теперь прорисовка довольно оптимизирована. Если вы хотите, чтобы анимация была еще быстрее , просто строите каждый 2-й, 3-й, ..., n-й временной шаг вместо каждого временного шага, используя for k = 2:n:maxT
.