【问题标题】:MATLAB: function point_cloudMATLAB:函数点云
【发布时间】:2018-07-12 01:15:12
【问题描述】:

问题: 编写一个名为 point_cloud 的函数,它将一个标量作为输入参数(该函数不必检查输入的格式)并且没有输出参数。

如果这样调用,point_cloud(100),那么它会绘制 100 个点。每个点都有一个随机 x 坐标和一个随机 y 坐标,每个坐标都是通过调用 randn 获得的,它使用标准差等于 1 的正态分布。绘图轴的范围在 x 和 y 维度上应该是 -5 到 5。应该关闭网格。应通过调用 plot 一次绘制和显示一个点,只指定一个点,然后在调用 plot 之后调用 drawnow,这会导致要立即绘制的点。命令hold on 应该包括在内,以便在绘制新点时保留所有先前的点。

图 2.41 显示了 point_cloud(100000) 在 Mac 上完成逐点绘图后的绘图示例视图。 (请注意,在 Windows 上,点要大得多。还要注意,使用 drawnow 绘制这么多点需要很长时间。最后,尝试在中间放大。)

Figure 2.41

我的代码:

    function point_cloud(N)

    hold on
    grid off
    axis([-5,5,-5,5])
    for ii = 1:N
        plot(randn(ii));
        drawnow;
    end

我知道这是错误的,但我不确定如何解决这个问题。有人可以帮忙吗?

解决的代码:

    function point_cloud(N)

    figure
    hold on
    grid off
    axis([-5,5,-5,5])
    x = randn(N,1);
    y = randn(N,1);
    for ii = 1:N
        plot(x(ii),y(ii),'b.');
        drawnow;
    end

【问题讨论】:

  • 您可以在 MATLAB 命令提示符下键入 help drawnow 来阅读它的作用以及如何调用它。
  • 好的,我编辑了我的代码,但我没有得到图中显示的内容。 MATLAB 正在绘制线而不是点。
  • randn(ii) 创建一个 iixii 随机值矩阵。您只需要在每次迭代中使用其中的两个(x 和 y)。还可以查看help plot 以了解如何使用其 x 和 y 坐标绘制一个点。我没有给你解决方案,因为我想让你学习。 :)
  • 谢谢,我想我解决了。 查看上面的更新代码。此代码有效,但是当我输入 point_cloud(100000) 时出现错误,因为数组大小对于 MATLAB 来说太大了。有解决办法吗?
  • 太棒了!这有点违反直觉,但randn(N) 不会生成N 随机数,而是N*N(它生成一个边为N 的方阵)。你想改用randn(N,1)。在内存中拟合应该没有问题。另一种方法是在循环内一一生成随机数:plot(randn(1),randn(1),...

标签: matlab


【解决方案1】:

您根本不需要 for 循环。并且每次迭代绘制绘图都非常耗时。不如使用scatter 函数。

figure
hold on
grid off
axis([-5,5,-5,5])
x = randn(N,1);
y = randn(N,1);
scatter(x,y,'b.')

这会快很多。

【讨论】:

  • 当然没必要。但是,如果您阅读该问题,您会发现这是一个课程练习。教授在编写练习时的想法是另一个问题......
【解决方案2】:

要添加到另一个答案,这里是作为函数的代码,添加的功能是点在 Windows 上也是一个像素:

function point_cloud(N)
    f = figure;
    x = randn(N,1);
    y = randn(N,1);
    scatter(x,y,1/36,'b.');
    f.GraphicsSmoothing = 'off';
    grid off
    axis([-5,5,-5,5])
    axis equal
end

标记的大小由scatter的第三个参数设置:1/36。图形的图形平滑也需要设置为“关闭”,以确保像素不会变得模糊或变亮。

这是一个 3D 版本:

function point_cloud3D(N)
    f = figure;
    x = randn(N,1);
    y = randn(N,1);
    z = randn(N,1);
    scatter3(x,y,z,1/36,'b.');
    f.GraphicsSmoothing = 'off';
    grid off
    axis([-5,5,-5,5,-5,5])
    axis square
    view(3)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多