这是关于MATLAB如何花费截然不同的时间来绘制同一件事的原因,以及原因。
我在3D空间中产生10000点:
X = rand(10000, 1); Y = rand(10000, 1); Z = rand(10000, 1); 然后,我使用四种不同方法之一对此进行绘制,以创建如下所示的图:
我关闭了所有数字并清除了每次运行之间的工作空间,以确保公平。
使用scatter3进行批量绘图:
>> tic; scatter3(X, Y, Z); drawnow; toc Elapsed time is 0.815450 seconds.
使用scatter3进行个别绘图:
>> tic; hold on; for i = 1:10000 scatter3(X(i), Y(i), Z(i), 'b'); end hold off; drawnow; toc Elapsed time is 51.469547 seconds.
使用plot3进行批量绘图:
>> tic; plot3(X, Y, Z, 'o'); drawnow; toc Elapsed time is 0.153480 seconds.
使用plot3进行个别绘图:
>> tic; hold on for i = 1:10000 plot3(X(i), Y(i), Z(i), 'o'); end drawnow; toc Elapsed time is 5.854662 seconds. MATLAB在“更长的”例程中花了这么长时间在幕后做什么?使用每种方法的优点和缺点是什么?
编辑:感谢本· drawnow (Ben Voigt)的建议(请参阅答案),我在时间安排中包括了drawnow命令,但这对时间没有多大影响。
回答:
运行scatter3和plot3所需时间之间的主要区别在于, plot3已编译,而scatter3被解释(编辑函数时会看到)。如果还对scatter3进行了编译,则速度差异将很小。
循环绘制和一次绘制之间的主要区别在于,您将绘制的手柄作为子代添加到坐标轴上(请查看get(gca,'Children') ),因此,您正在循环内增长一个复杂的数组,我们都知道这很慢。此外,您经常调用多个函数,而不仅仅是一次调用,因此会导致函数开销。
重新计算轴限制在这里不是问题。如果你跑
for i = 1:10000 plot3(X(i), Y(i), Z(i), 'o'); drawnow; end 这会迫使Matlab在每次迭代时更新图形(并且速度会慢很多),您会看到轴限制根本没有改变(因为默认轴限制为0和1)。但是,即使轴的限制以不同的方式开始,它们也不需要花费很多迭代即可收敛于这些数据。与省略hold on ,这会使绘制花费更长的时间,因为在每一步都要重新计算轴。
为什么要有这些不同的功能? scatter3允许您在单个手柄下绘制具有不同标记大小和颜色的点,而您需要一个循环并使用plot3获得每个点的手柄,这不仅在速度方面,而且在成本方面也很昂贵记忆。但是,如果您需要分别与不同的点(或点组)进行交互-也许您想为每个点添加一个单独的图例条目,也许您希望能够分别打开和关闭它们,等等-循环使用plot3可能是最好的(尽管很慢)解决方案。
更多&回答...