struct строит структуру или массив структур

## Синтаксис

                st = struct(field1, value1, field2, value2, ...)

## Аргументы

field1, field2, ...
  строки: имена полей структуры с учётом регистра. Разрешены расширенные не-ascii UTF-символы.

value1, value2, ...
  данные, присвоенные соответствующим полям. Поддерживаются все типы данных. Если несколько значений являются нескалярными cell-массивами, то они должны быть одинакового размера. Для любого cell-скаляра cell-контейнер удаляется и его содержимое рассматривается и присваивается полю как единое целое. Обработка cell-массивов описана ниже.

st
  скалярная структура или массив структур, если хотя бы одно значение является нескалярным cell-массивом.

## Описание

### Скалярная структура

Если ни одно из значений `value1`, `value2`, ..., `valueN` не является нескалярным cell-массивом, то `st = struct(field1, value1, field2, value2, ...)` строит скалярную структуру `st` (размером 1×1) с полями и значениями `st.field1=value1`, `st.field2=value2`, ..., `st.fieldN=valueN`.

Значение любого поля такой скалярной структуры может быть скаляром или массивом. Размеры значений разных полей могут быть разными. Например: `st = struct("u",[2 3], "v",[%t %f ; %f %t], "w","Hello")` совершенно допустимо и устанавливает `st.u=[2 3]`, `st.v=[%t %f ; %f %t]` и `st.w="Hello"`.

Можно присвоить скалярные или нескалярные cell-массивы полю скалярной структуры, встраивая её в скалярный cell-массив. Например: `st = struct("num",1:3, "c",{{sin}})` установит `st.num=1:3` и `st.c={sin}` ; в то время, как `st = struct("text","Hello", "test",{{1, sin ; %t %z}})` установит `st.text="Hello"` и `st.test={1,sin;%t,%z}`.

### Массив структур

struct(..) позволяет строить любой массив структур -- вектор, матрицу или ND-массив. Все элементы массива имеют одинаковый набор полей `field1`, `field2`, ..., `fieldN`.

Действительно, если хотя бы одно из указанных значений является нескалярным cell-массивом `C`, то `st=struct(..,field,C,..)` строит массив структур с `size(st)==size(C)` и устанавливает `st(i).field=C{i}` для любого индекса `i`.

В этом случае любые скалярные величины, определённые для других определённых полей, копируются и устанавливаются для всех элементов `st`.

Пример №1: `st=struct("u", {-1,%f,%z})` определяет вектор-строку 1×3 структур с единственным полем "u" со значениями `st(1).u=-1`, `st(2).u=%f` и `st(3).u=%z`.

Пример №2: `st=struct("u", {-1 ; %f}, "t", "Hi")` определяет вектор-столбец 2×1 структур с двумя полями "u" и "t" со значениями `st(1,1).u=-1`, `st(1,1).t="Hi"`, `st(2,1).u=%f`, `st(2,1).t="Hi"`.

`type(st)` возвращает `17`, а `typeof(st)` возвращает `"st"`.

## Примеры

    // Создать скалярную структуру Dates
    Dates = struct('day',25, 'month','DEC', 'year',2006)
    Dates.month = 'AUG'         // изменить месяц
    Dates.year  = 1973;         // изменить год
    Dates.weekday = "Saturday"  // добавить новое поле

    // Создать второй элемент, чтобы сделать Dates вектором дат:
    Dates(1,2).year = 2020
    Dates(2) // Заметьте, что значение поля по умолчанию равно []

    // Построение элемента полной структуры Dates(2) для всех полей.
    // Одинаковые поля можно декларировать в любом порядке:
    Dates(2) = struct('year',2000, 'day',29, 'weekday',"Tuesday", 'month', "FEB")
    Dates(2)
    Dates(2,3) = struct('weekday',"Sunday", 'day',7, 'month',"FEB", 'year',2021)
    Dates(2,3)
    size(Dates)
    length(Dates)

    --> Dates = struct('day',25, 'month','DEC', 'year',2006)
     Dates  =
      day = 25
      month = "DEC"
      year = 2006

    --> Dates.month = 'AUG'         // change the month
     Dates  =
      day = 25
      month = "AUG"
      year = 2006

    --> Dates.year  = 1973;         // change the year
    --> Dates.weekday = "Saturday"  // Add a new field
     Dates  =
      day = 25
      month = "AUG"
      year = 1973
      weekday = "Saturday"

    --> // Create a 2nd element, to make Dates a vector of dates:
    --> Dates(1,2).year = 2020
     Dates  =
      1x2 struct with fields:
      ["day", "month", "year", "weekday"]

    --> Dates(2) // Note that the default fields value is []
     ans  =
      day = []
      month = []
      year = 2020
      weekday = []

    --> // Building the full Dates(2) structure element for all fields.
    --> // The same fields can be declared in any other order:
    --> Dates(2) = struct('year',2000, 'day',29, 'weekday',"Tuesday", 'month', "FEB")
     Dates  =
      1x2 struct with fields:
      ["day", "month", "year", "weekday"]

    --> Dates(2)
     ans  =
      day = 29
      month = "FEB"
      year = 2000
      weekday = "Tuesday"

    --> Dates(2,3) = struct('weekday',"Sunday", 'day',7, 'month',"FEB", 'year',2021)
     Dates  =
      2x3 struct with fields:
      ["day", "month", "year", "weekday"]

    --> Dates(2,3)
     ans  =
      day = 7
      month = "FEB"
      year = 2021
      weekday = "Sunday"

    --> size(Dates)
     ans  =
       2.   3.

    --> length(Dates)
     ans  =
       6.

Массив структур, построенный с нуля:

    Dates = struct("day",{10 3 ; 25 17}, "month",{"SEP" "JUN" ; "APR" "NOV"}, "year",2020)
    Dates(2,1)

    --> Dates = struct("day",{10 3 ; 25 17}, "month",{"SEP" "JUN" ; "APR" "NOV"}, "year",2020)
     Dates  =
      2x2 struct with fields:
      ["day", "month", "year"]

    --> Dates(2,1)
     ans  =
      day = 25
      month = "APR"
      year = 2020

Структура с cell-массивами в качестве значения полей:

    test = struct("number", %pi, "bool",[%f %f], "myCell",{{2 "-5";(1-%z)^3,%t}})
    test.myCell
    test.myCell{2,1}

    --> test = struct("number", %pi, "bool",[%f %f], "myCell",{{2 "-5";(1-%z)^3,%t}})
     test  =
      number = 3.1415927
      bool = [%f,%f]
      myCell: [2x2 cell]

    --> test.myCell
     ans  =
      [1x1 constant  ]  [1x1 string ]
      [1x1 polynomial]  [1x1 boolean]

    --> test.myCell{2,1}
     ans  =
      1 -3z +3z² -z³

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

- fieldnames
- tree_show
- makecell
- mlist
- tlist