首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MATLAB中加速一个非常慢的动画情节

如何在MATLAB中加速一个非常慢的动画情节
EN

Stack Overflow用户
提问于 2018-04-30 04:23:09
回答 1查看 3K关注 0票数 1

我试图创建一个动画情节,但我的代码非常慢,也许我使用的方法太天真了。在下面的示例中,我有4个子图,每个子图有3行,在'time‘循环中更新。

代码语言:javascript
复制
clc;clear;close all;
state = {'$x-Position$','$x-Velocity$','$y-Position$','$y-Velocity$'};
ylabels = {'$x$','$\dot{x}$','$y$','$\dot{y}$'};
options1 = {'interpreter','latex'};
options2 = {'interpreter','latex','fontsize',20};
maxT = 300;

for pp = 1:4
    hh1(pp)=subplot(2,2,pp);
    xlabel('$t$',options2{:});
    ylabel(ylabels{pp},options2{:});
    title(state{pp},options1{:})
    xlim([0 maxT])
    hold on
end
x = randn(4,300);
z = randn(4,300);
x_est = randn(4,300);
for k = 2:maxT
    for p = 1:4
        plot(hh1(p),k-1:k,x(p,k-1:k),'b','linewidth',2)
        plot(hh1(p),k-1:k,z(p,k-1:k),'m')
        plot(hh1(p),k-1:k,x_est(p,k-1:k),':k','linewidth',2)
    end
    drawnow;
end

剖面仪输出上可以看出,drawnow正在消磨时间。有什么办法可以更有效地创造这个动画吗?

EN

回答 1

Stack Overflow用户

发布于 2018-04-30 08:17:33

因为您想要动画,所以除了使用drawnow更新框架之外,别无选择。然而,并不是特别的drawnow让你慢下来--分析器可能会误导你……drawnow只是简单地更新了上次重新绘制后的所有图形更改,在您的例子中,这是一打新的情节!

你会发现hold非常慢。例如,如果您对持有权有更多的了解,则删除现有的hold on,只有在实际绘图时才保留

代码语言:javascript
复制
% ... 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秒)。

代码语言:javascript
复制
% ... 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,.,第9次时间步骤,而不是每一次使用for k = 2:n:maxT的时间步骤。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50093938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档