【问题标题】:Retain meshgrid structure when subsetting a meshgrid子集网格网格时保留网格网格结构
【发布时间】:2015-10-01 16:17:40
【问题描述】:

当我对从meshgrid 构造的数组进行子集化时,我无法弄清楚如何保持其网格网格结构。因此,您不能在对meshsurface 的调用中使用它。我将在构建单位球体的示例中演示这一点。

此问题可能的替代标题:

  1. 如何在 Matlab 中从头开始制作网格网格球体的上半部分?
  2. 如何使用网格来绘制网格网格的子集?

这是使用以下玩具示例激发的,该示例在 Matlab 中从头开始构造一个单位半径的球体,因此它类似于以下生成的:

[x, y, z] = sphere(100)
mesh(x, y, z)

对球体使用方程:

定义一个网格并将z 定义为:

x = linspace(-1, 1, 201);
y = linspace(-1, 1, 201);
[x, y] = meshgrid(x, y);
z = sqrt(1 - x.^2 - y.^2);

到目前为止一切顺利,除了z 采用虚值,其中球体在 xy 平面上不存在,即单位圆之外的任何位置。

现在调用mesh 会返回错误:

>> mesh(x, y, z)
Error using mesh (line 58)
X, Y, Z, and C cannot be complex.

因此,一个合乎逻辑的步骤是删除所有复杂值:

% get logical vector index where real z is
LI = z == real(z)

x = x(LI)
y = y(LI)
z = z(LI)

但现在xyz 不再是3d 数组,调用mesh 会出现另一个错误:

>> mesh(x, y, z)
Error using mesh (line 58)
Z must be a matrix, not a scalar or vector.

所以,总的来说,我不知道如何在对数据进行子集化时保留 meshgrid 结构。因此,我无法从头开始生成这个球体的上半部分。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    通常,您可以使用 NaN 值从绘图中“排除”值,同时保持矩阵结构。在你的情况下,试试这个:

    LI = z == real(z);
    z(~LI) = NaN;
    mesh(x,y,z);
    

    【讨论】:

    • 谢谢。现在我在尝试使用slice 时遇到了另一个问题:输入点的坐标必须是有限值;不允许使用 Inf 和 NaN。
    • 在任何情况下使用 NaN 都不理想。所以也许你可以看看这个link 来了解如何使用球坐标 phi 和 theta 正确生成球体。要生成半球,我会将链接中的代码修改为phi=linspace(0,pi/2,30);
    • 不幸的是,球坐标对我拥有的数据没有帮助。回到球体的例子,我认为很难通过使用对角平面切割球体来形成表面。从概念上讲,最好的方法是使用一个子集,但如果你使用一个子集,它会破坏网格结构。
    • 上面链接中的代码以球面数据开始,然后转换为 x,y,z 数据,它产生的结果与sphere 函数几乎相同。无论如何,当您使用子集时,新结构确实与原始结构不同,但您仍然可以使用它,例如。 m=10:100; mesh(x(m,m),y(m,m),z(m,m)); 至于你对slice 的问题,也许你应该提出一个新问题并提供更多细节。
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2021-12-02
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多