登录论坛

查看完整版本 : MATLAB scatter3,plot3速度差异


poster
2019-12-10, 20:48
这是关于MATLAB如何花费截然不同的时间来绘制同一件事的原因,以及原因。

我在3D空间中产生10000点:

X = rand(10000, 1); Y = rand(10000, 1); Z = rand(10000, 1); 然后,我使用四种不同方法之一对此进行绘制,以创建如下所示的图:

https://i.stack.imgur.com/wrkqr.png

我关闭了所有数字并清除了每次运行之间的工作空间,以确保公平。

使用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可能是最好的(尽管很慢)解决方案。



更多&回答... (https://stackoverflow.com/questions/4111170)