【问题标题】:Why do we need a matrix to plot 3D graphs in MATLAB?为什么我们需要一个矩阵来在 MATLAB 中绘制 3D 图?
【发布时间】:2021-10-26 15:41:10
【问题描述】:

我正在研究 MATLAB,发现了这个用于绘制 3d 图形的代码

x=-8:0.1:8
y=x
[X,Y]=meshgrid(x,y)
R=sqrt(X.^2+Y.^2)+eps
Z=sin(R)./R
mesh(x,y,Z,'-')

meshgrid函数的使用感到困惑,我决定尽量避免它,而是写了

x=-8:0.1:8
y=x
r=sqrt(x.^2+y.^2)+eps
z=sin(r)./r
mesh(x,y,z)

令我惊讶的是,它显示错误

Z must be a matrix, not a scalar or vector

现在,据我了解,要绘制 3d 图形,您只需在给定值时相应地标记点 (x,y,z)(在 2d 的情况下,这就是它的作用)。为此,它只需要xyz 的值列表。那么,将z 作为列表到底有什么问题呢?我希望得到一个详细的答案。

【问题讨论】:

    标签: arrays matlab matrix plot


    【解决方案1】:

    如果您查看找到该示例的documentation page,则会给出用法: 强调我的

    mesh(X,Y,Z) 创建一个网格图,它是一个具有实心边缘颜色且没有面颜色的三维曲面。该函数将 ma​​trix Z 中的值绘制为由 XY 定义的 x-y 平面中网格上方的高度。边缘颜色根据Z指定的高度而变化。

    你提到的例子是这样的:

    [X,Y] = meshgrid(-8:.5:8);
    R = sqrt(X.^2 + Y.^2) + eps;
    Z = sin(R)./R;
    mesh(X,Y,Z)
    

    meshgrid() 的文档说:

    [X,Y] = meshgrid(x)[X,Y] = meshgrid(x,x) 相同,返回网格大小为length(x)-by-length(x) 的正方形网格坐标。

    好的,meshgrid(x, x) 在做什么?

    [X,Y] = meshgrid(x,y) 根据向量xy 中包含的坐标返回二维网格坐标。 X 是一个矩阵,其中每一行都是x 的副本,Y 是一个矩阵,其中每一列 都是y 的副本。坐标XY 表示的网格有length(y) 行和length(x) 列。

    这很不言自明,对吧?例如,当您执行[X, Y] = meshgrid(-8:2:8) 时,您会得到: 我降低了点的密度以帮助澄清正在发生的事情

    X =
    
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
      -8  -6  -4  -2   0   2   4   6   8
    
    Y =
    
      -8  -8  -8  -8  -8  -8  -8  -8  -8
      -6  -6  -6  -6  -6  -6  -6  -6  -6
      -4  -4  -4  -4  -4  -4  -4  -4  -4
      -2  -2  -2  -2  -2  -2  -2  -2  -2
       0   0   0   0   0   0   0   0   0
       2   2   2   2   2   2   2   2   2
       4   4   4   4   4   4   4   4   4
       6   6   6   6   6   6   6   6   6
       8   8   8   8   8   8   8   8   8
    

    如果你为所有ij 绘制x = X(i, j)y = Y(i, j) 给出的每个点,你会得到这样的结果:

    当您执行下一行时:

    R = sqrt(X.^2 + Y.^2) + eps;
    Z = sin(R) ./ R;
    

    您正在做矩阵数学,RZ 是矩阵,就像 XY。元素Z(i, j) 为您提供z 轴在x = X(i, j)y = Y(i, j) 的值。

    但是,当您运行您的代码时,xyz 是向量。如果您绘制所有 xy 对(我再次降低了点的密度),您会得到红点 - 一条对角线,而不是您实际需要的网格。

    mesh() 需要你的点在一个网格上(因为它就是这样做的——创建一个 mesh 图)。您的代码仅提供对角线上的点的zx = y

    绘制矩阵给出表面/网格图:

    如果您只需要 3D 线图,请查看 plot3() 函数。

    plot3(x, y, z) 给出:

    【讨论】:

    • 不错!我刚刚尝试在程序中使用plot3 而不是mesh(没有meshgrid 命令),它成功了!现在,我明白了其中的区别。谢谢!
    • 这实际上是一个绝妙的答案!
    • 很高兴您发现它有帮助。如果我可以为初学者提供一个提示:不要犹豫,阅读文档并尝试一下。由于这个原因,matlab 命令窗口令人惊叹:它是REPL,因此您可以尝试不同的东西并实时查看它们的作用。当您尝试直观地了解您的代码在做什么时,减少问题的大小然后打印您正在做的事情非常有帮助@SayanDutta
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2014-06-12
    • 2018-11-22
    • 2015-11-09
    • 2015-07-04
    相关资源
    最近更新 更多