如何在MATLAB中有效地对图进行动画处理?

时间:2019-02-12 04:20:05

标签: matlab animation plot matlab-figure

我在下面编写了一个用于对图进行动画处理的简单代码,但是它们往往需要大量的计算,比预期的要花费整整几秒钟:

function animplot(t,f,ymin,ymax,dt,num_iters)
h = plot(0,0); % set initial handle for first iteration
tic % start timer
for i=2:num_iters
    delete(h);
    h = plot(t,f(t-dt*i),'LineWidth',2,'color','b');
    axis([min(t) max(t) ymin ymax]); pause(1/num_iters)
end
toc % end timer, return time elapsed since 'tic'
end

1/num_iters替换为dT = T / num_iters,并设置T = 1,则1000次迭代的计算时间为6+秒(而不是1)。 Sample animation代表t = 0:.01:2*pi; f = @(t)sin(t); dt = .05; num_iters = 1000

以这种方式进行动画制作的更有效的方法吗?

2 个答案:

答案 0 :(得分:0)

效率更高的代码,适用于related inquiry中的每个解决方案:

function  animplot(t,f,ymin,ymax,dt,num_iters,T)
% ANIMPLOT(t,f,ymin,ymax,dt,num_iters) -- f must be defined w/ handle, 
% e.g. f = @(t)sin(t); default T = 5, num_iters = 500, dt = .05,
% (ymax - ymin) = 1.4*range.
switch nargin
    case 6; T = 5;
    case 5; T = 5; num_iters = 500;
    case 4; T = 5; num_iters = 500; dt = .05;
    case 2; T = 5; num_iters = 500; dt = .05; 
            ymin = 1.2*min(f(t)) - max(f(t))/5;
            ymax = 1.2*max(f(t)) - min(f(t))/5;
end

dT = T/num_iters; % set pause interval
h = plot(0,0,'LineWidth',2,'color','b'); % set initial handle
set(h, 'Xdata',t, 'Ydata', f(t));        % initialize curve plot
axis([min(t) max(t) ymin ymax]);
tic % start timer
for i=2:num_iters
    pause(dT)
    set(h, 'Ydata', f(t-dt*i))
end
toc % end timer, return time elapsed since 'tic'
end

注意:num_iters主要用作动画的“分辨率”;更高的值将以更大的代价偏离集合T

答案 1 :(得分:0)

使用命令:“ set(h,'Xdata',t,'Ydata',f(t))”会比在每次循环迭代中重用plot函数更有效,并且可能足以满足实现您想要的结果。为了进一步改善,您可以启用可变帧率。为此,消除任何“ pause(dt)”,获取当前循环迭代的时间“ t”,评估该时间的函数“ f(t)”,然后将图x和y数据设置为此。这样可以确保动画流畅不会花费超过指定的时间。您还可以通过使用“ interp1(x,v,xq)”函数对数据集(不仅是函数)使用此技术,以在数据点之间进行线性插值。