ndgrid строит матрицы или N-мерные массивы путем репликации данных векторов

## Синтаксис

                [X, Y] = ndgrid(x)
                [X, Y] = ndgrid(x,y)
                [X, Y, Z] = ndgrid(x,y,z)
                [X, Y, Z, T] = ndgrid(x,y,z,t)
                [X1, X2, ..., Xm] = ndgrid(x1,x2,...,xm)

## Аргументы

x, y, z, ...

  векторы любых типов данных. Они могут иметь различные типы данных. По умолчанию `y=x`.

X, Y, Z, ...

  В случае двух входных аргументов это матрицы, в противном случае это гиперматрицы. Все они имеют одинаковые размеры: `size(x,"*")` строк, `size(y,"*")` столбцов, `size(z,"*")` слоёв и так далее.

  Они имеют одинаковые типы данных соответствющих входных векторов: `typeof(X)==typeof(x)`, `typeof(Y)==typeof(y)`, и т.д.

## Описание

Первое применение функции `ndgrid` заключается в построении сетки узлов, формирующих двумерное, трёхмерное или N-мерное пространство в соответствии с 2, 3 и более наборами `x`, `y` и т.д. координат "шаблона" продискретизированных вдоль каждого направления/размерности пространства, которое вы желаете сформировать.

Следовательно, матрица или гиперматрица `X` сделана через копирование вектора `x` по столбцам; матрица или гиперматрица `Y` сделана через копирование вектора `y` по строкам; матрица `Z` сделана через копирование вектора `z` по всем слоям (третье измерение); и т.д

    --> [X, Y] = ndgrid([1 3 4], [0 2 4 6])
     X  =
       1.   1.   1.   1.
       3.   3.   3.   3.
       4.   4.   4.   4.

     Y  =
       0.   2.   4.   6.
       0.   2.   4.   6.
       0.   2.   4.   6.

Эта схема копирования может быть обобщена к любому числу измерений, а также к любому типу универсальных данных. Давайте, например, возьмём 2 атрибута:

1. Первый - это число, которое нужно выбрать из вектора, скажем `n = [ 3 7 ]`
2. Второй - это буква, которую нужно выбрать из вектора, скажем `c = ["a" "e" "i" "o" "u" "y"]`

Тогда мы хотим построить множество всех `{n,c}` возможных пар. Это будет просто двумерная сетка:

    --> [N, C] = ndgrid([3 7],["a" "e" "i" "o" "u" "y"])
     C  =
    !a  e  i  o  u  y  !
    !a  e  i  o  u  y  !

     N  =
       3.   3.   3.   3.   3.   3.
       7.   7.   7.   7.   7.   7.

Тогда `object(i,j)` будет иметь свойства `{n(i) c(j)}`, которые темер могут быть адресованы как `{N(i,j) C(i,j)}`. Такой вид сетки может быть полезен для инициализации массива структур.

Следующие примеры показывают как использовать `X, Y, Z` в наиболее распространёных приложениях

## Примеры

Пример #1:

    // создание простой двухмерной координатной сетки
    x = linspace(-10,2,40);
    y = linspace(-5,5,40);
    [X,Y] = ndgrid(x,y);

    // Compute ordinates Z(X,Y) on the {X, Y} grid and plot Z(X,Y)
    Z = X - 3*X.*sin(X).*cos(Y-4) ;

    clf()
    plot3d(x,y,Z, flag=[color("green") 2 4], alpha=7, theta=60); show_window()

x = linspace(-10,2,40); y = linspace(-5,5,40); [X,Y] = ndgrid(x,y); Z = X - 3*X.*sin(X).*cos(Y-4) ; clf() plot3d(x,y,Z, flag=[color("green") 2 4], alpha=7, theta=60); show_window()

Пример #2:

    // создание простой трёхмерной координатной сетки
    nx = 10; ny = 6; nz = 4;
    x = linspace(0,2,nx);
    y = linspace(0,1,ny);
    z = linspace(0,0.5,nz);
    [X,Y,Z] = ndgrid(x,y,z);

    // попытаемся отобразить эту трёхмерную координатную сетку ...
    XF=[]; YF=[]; ZF=[];
    for k=1:nz
       [xf,yf,zf] = nf3d(X(:,:,k), Y(:,:,k), Z(:,:,k));
       XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf];
    end
    for j=1:ny
       [xf,yf,zf] = nf3d(matrix(X(:,j,:),[nx,nz]),..
                         matrix(Y(:,j,:),[nx,nz]),..
                         matrix(Z(:,j,:),[nx,nz]));
       XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf];
    end

    clf()
    plot3d(XF,YF,ZF, flag=[0 6 3], 66, 61, leg="X@Y@Z")
    xtitle("Трёхмерная сетка!"); show_window()

nx = 10; ny = 6; nz = 4; x = linspace(0,2,nx); y = linspace(0,1,ny); z = linspace(0,0.5,nz); [X,Y,Z] = ndgrid(x,y,z); XF=[]; YF=[]; ZF=[]; for k=1:nz [xf,yf,zf] = nf3d(X(:,:,k), Y(:,:,k), Z(:,:,k)); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; end for j=1:ny [xf,yf,zf] = nf3d(matrix(X(:,j,:),[nx,nz]),.. matrix(Y(:,j,:),[nx,nz]),.. matrix(Z(:,j,:),[nx,nz])); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; end clf() plot3d(XF,YF,ZF, flag=[0 6 3], 66, 61, leg="X@Y@Z") xtitle("Трёхмерная сетка!"); show_window()

Пример #3: Создание таблицы пар символов:

    [c1, c2] = ndgrid(["a" "b" "c"], ["a" "b" "c" "d" "e" "f" "g" "h"])
    c1+c2

    --> [c1, c2] = ndgrid(["a" "b" "c"], ["a" "b" "c" "d" "e" "f" "g" "h"])
     c2  =
    !a  b  c  d  e  f  g  h  !
    !a  b  c  d  e  f  g  h  !
    !a  b  c  d  e  f  g  h  !

     c1  =
    !a  a  a  a  a  a  a  a  !
    !b  b  b  b  b  b  b  b  !
    !c  c  c  c  c  c  c  c  !

    --> c1+c2
     ans  =
    !aa  ab  ac  ad  ae  af  ag  ah  !
    !ba  bb  bc  bd  be  bf  bg  bh  !
    !ca  cb  cc  cd  ce  cf  cg  ch  !

## Смотрите также

- meshgrid
- kron
- feval
- nf3d

## История

6.0.0 Расширение до всех однородных типов данных ([], логические, закодированные целые числа, многочлены, дроби, строковые значения). Пересмотр этой странички справки.
6.0.1 `ndgrid(x)` теперь принимает по умолчанию `y=x`.