代码之家  ›  专栏  ›  技术社区  ›  Bill Cheatham

MATLAB scatter3,plot3速度离散

  •  7
  • Bill Cheatham  · 技术社区  · 14 年前

    我在三维空间生成10000个点:

    X = rand(10000, 1);
    Y = rand(10000, 1);
    Z = rand(10000, 1);
    

    然后,我使用四种不同的方法之一来绘制此图,以创建类似这样的图:

    alt text

    我关闭了所有图形,并在每次运行之间清除了工作区,以确保公平性。

    使用scatter3进行批量绘图:

    >> tic; scatter3(X, Y, Z); drawnow; toc
    Elapsed time is 0.815450 seconds.
    

    使用散射体3进行单独绘图:

    >> 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.
    

    >> 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.
    

    编辑: 感谢Ben Voigt的建议(见答案),我已经包括 drawnow 但这对时代没有什么影响。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Jonas    14 年前

    运行所需时间之间的主要差异 scatter3 plot3 绘图3 是编译的,而 被解释(编辑函数时会看到)。如果 散射体3

    在循环中绘制所需的时间与一次性绘制所需的时间之间的主要区别在于,将句柄作为子对象添加到轴中(查看 get(gca,'Children') ),因此在一个循环中增加了一个复杂的数组,我们都知道这个过程很慢。此外,您经常调用多个函数,而不是仅仅调用一次,因此会引起函数开销的调用。

    重新计算轴限制在这里不是问题。如果你跑

    for i = 1:10000
        plot3(X(i), Y(i), Z(i), 'o');
        drawnow;
    end
    

    这迫使Matlab在每次迭代时更新图形(而且速度要慢得多),您将看到轴限制根本没有改变(因为默认的轴限制是0和1)。然而,即使轴限制的起点不同,它们与这些数据的收敛也不需要很多迭代。与省略 hold on ,这使得绘制需要更长的时间,因为每个步骤都会重新计算轴。

    为什么有这些不同的功能? 散射体3 允许您在单个句柄下绘制具有不同标记大小和颜色的点,同时需要循环并使用 绘图3 绘图3

        2
  •  6
  •   Amro    14 年前

    为了更快的方法,考虑第三个选项(直接使用低级函数行):

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

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

        3
  •  4
  •   Ben Voigt    14 年前

    另外,我不确定你的计时信息是否准确,因为你没有打电话 drawnow ,因此实际绘图可以在 toc

    总而言之:

    • plot3 是最快的,因为它在许多不同的位置绘制相同的标记
    • scatter3 绘制许多不同的标记,因为标记的大小和颜色(允许)因每个点而异
    • 在循环中调用非常慢,因为参数解析等必须重复进行,此外,随着点添加到绘图中,轴必须重新计算
    推荐文章