繁体   English   中英

MATLAB scatter3,plot3速度的差异

[英]MATLAB scatter3, plot3 speed discrepencies

这是关于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在“更长”的例程中幕后花了这么长时间? 使用每种方法有哪些优缺点?

编辑:感谢Ben Voigt的建议(见答案),我在时间中包含了drawnow命令 - 但这对时间没什么影响。

运行scatter3plot3所需的时间之间的主要区别在于plot3被编译,而scatter3被解释(正如您在编辑函数时所看到的那样)。 如果编译了scatter3 ,速度差异也会很小。

在循环中绘制所需的时间与一次绘制所需的时间之间的主要区别在于您将绘图的句柄作为子项添加到轴(查看get(gca,'Children')的输出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 ,这不仅在速度方面成本高,而且在记忆。 但是,如果你需要单独与不同的点(或点组)进行交互 - 也许你想为每个点添加一个单独的图例条目,也许你希望能够单独打开和关闭它们等 - 在循环中使用plot3可能是最好的(虽然很慢)解决方案。

要获得更快的方法,请考虑第三个选项(直接使用低级函数LINE):

line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)

以下是一些讨论绘制性能问题的文章:

好吧,如果你想控制每个点的颜色,批量散射会更快,因为你需要单独调用plot。

此外,我不确定您的计时信息是否准确,因为您没有调用drawnow ,因此实际绘图可以在toc之后进行。

综上所述:

  • plot3是最快的,因为它在许多不同的位置绘制相同的标记
  • scatter3绘制了许多不同的标记,因为标记的大小和颜色(允许)随每个点而变化
  • 在循环中调用真的很慢,因为参数解析等必须重复进行,此外,当曲线添加到绘图中时,轴必须重新计算

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM