在对网格网格进行子集化时保留网格网格结构

时间:2015-10-01 06:12:14

标签: matlab

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

此问题的可能替代标题:

  1. 如何在Matlab中从头开始创建meshgrid球体的上半部分?
  2. 如何使用网格绘制网格网格的子集?
  3. 这是出于以下玩具示例的动机:在Matlab中从头开始构建单位半径的球体,这样就像生成的那样:

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

    使用球体的等式:

    equation of sphere

    定义meshgrid并将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结构。因此,我无法从头开始生成该球体的上半部分。

1 个答案:

答案 0 :(得分:3)

一般情况下,您可以排除"通过使用 NaN 值来保持矩阵结构的绘图值。在你的情况下,试试这个:

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