Bil*_*ham 7 matlab plot timing scatter-plot
这是关于MATLAB如何用非常不同的时间来绘制相同的东西 - 以及为什么.
我在3D空间中生成了10000个点:
X = rand(10000, 1);
Y = rand(10000, 1);
Z = rand(10000, 1);
Run Code Online (Sandbox Code Playgroud)
然后我用四种不同的方法之一来绘制这个,创建一个如下的情节:

我关闭了所有数字并清除了每次运行之间的工作空间,以确保公平.
使用scatter3进行批量绘图:
>> tic; scatter3(X, Y, Z); drawnow; toc
Elapsed time is 0.815450 seconds.
Run Code Online (Sandbox Code Playgroud)
使用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.
Run Code Online (Sandbox Code Playgroud)
使用plot3批量绘图:
>> tic; plot3(X, Y, Z, 'o'); drawnow; toc
Elapsed time is 0.153480 seconds.
Run Code Online (Sandbox Code Playgroud)
使用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.
Run Code Online (Sandbox Code Playgroud)
什么是MATLAB在"更长"的例程中幕后花了这么长时间?使用每种方法有哪些优缺点?
编辑:
感谢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
Run Code Online (Sandbox Code Playgroud)
这迫使Matlab在每次迭代时更新图形(并且速度慢很多),您将看到轴限制根本不会改变(因为默认轴限制为0和1).但是,即使轴限制开始的方式不同,也不需要多次迭代就可以使这些数据收敛.比较省略hold on,这使得绘图需要更长时间,因为在每一步都会重新计算轴.
为什么有这些不同的功能?scatter3允许您在单个手柄下绘制具有不同标记大小和颜色的点,同时您需要一个循环并获得每个点的句柄plot3,这不仅在速度方面成本很高,而且在内存方面也是如此.但是,如果您需要单独与不同的点(或点组)进行交互 - 也许您想为每个点添加单独的图例条目,也许您希望能够单独打开和关闭它们等 - plot3在循环中使用可能是最好的(虽然很慢)解决方案.
要获得更快的方法,请考虑第三个选项(直接使用低级函数LINE):
line([X,X], [Y,Y], [Z,Z], 'LineStyle','none', 'Marker','o', 'Color','b')
view(3)
Run Code Online (Sandbox Code Playgroud)
以下是一些讨论绘制性能问题的文章: