对于Matlab如何处理最终导致不采取任何操作的基于图形的命令,是否有任何通用指南?一个简单的示例——注意这里的实际计算成本可以忽略不计:
fig=figure;
ax=axes;
for i=1:10
data=myFunction(i) %e.g. rand(i)
plot(data)
hold(ax,'on') %perform this repeatedly even though it's only needed once
end
对比:
fig=figure;
ax=axes;
for i=1:10
data=myFunction(i) %e.g. rand(i)
plot(data)
if ~ishold(ax)
hold(ax,'on') %perform this only if it is needed
end
end
如果在实际执行hold(ax,'on')
命令之前,Matlab内部确定是否需要该命令,那么第一种形式的计算成本可能相似或更低。编码也更容易实现和读取。但是,如果行动是完全执行的,那么从计算成本的角度来看,在某些情况下,使用第二种形式会更好
值得注意的是;没有动作";这里故意含糊其辞,有很多细微之处。例如,很容易创建一个示例,其中Matlab必须执行某个级别的计算,然后才能评估图形命令是否没有效果。例如,在colormap(myColormapFunction)
中,Matlab必须调用myColormapFunction
,以评估其返回的内容是否与现有绘图的CData
属性相同。谢谢
据我所知,没有关于如何"没有动作";命令由内置的MATLAB函数处理。同时,MathWorks确实提供了优化图形性能的指导方针;我觉得这是一件更重要的事情。
- 图形性能文档页面
现在,如果以下部分没有回答您的问题,我提前道歉。但是,如果你真的对幕后和现实世界的性能感到好奇,你应该使用提供的代码评测工具和内置的计时功能。
话虽如此,下一节是关于优化总体图形性能。
例如,在您提供的代码中,我强烈建议不要将hold
和plot
放在For循环中。根据我的经验,这些从来都不是必要的,可以优化掉。
在这里,我猜你是在尝试动画MATLAB绘图;在这种情况下,请尝试更新绘图标记,而不是使用绘图功能。例如:
figure
% Plot an empty plot with placeholder values (NaNs) the size of your data
% Save handle to plot object as `h`
h = plot( nan(size(data)) );
for i = 1:10
[Xdata, Ydata] = MyFunction(...);
% Update your plot markers with the handle update method
h.XData = Xdata;
h.YData = Ydata;
drawnow % drawnow to see animation
end
在这种情况下,我甚至不需要使用hold
函数,因为我只是在更新同一个图,这比快得多。
即使您的函数正在输出新的数据序列,并且您希望将它们绘制在旧数据序列的顶部,也可以使用相同的技巧它只需要预先分配绘图句柄和数据数组(老实说,这是一个很好的编程实践。(
figure
hold on % Hold the plot now
N = 100; % Number of data series you expect to have
H = cell(N,1); % Preallocate N Cells for all the plot handles
for i = 1:N
% Save plot handles to cell array in a loop, if you have so many series
H{i} = plot ( nan(size(data)) );
end
% Your iterative function calls
for t = 1:100
...
% Iteratively update all plot handles with a syntax like this
% (Not entirely sure, this is off the top of my head)
for i = 1:N
H{i}.XData = newX;
H{i}.YData = newY;
end
end