6.1.3 Создание структур
Помимо оператора индекса ".", Octave может использовать динамическое именование "(var)" или функцию struct для создания структур. Динамическое именование использует строковое значение переменной в качестве имени поля. Например:
a = "field2";
x.a = 1;
x.(a) = 2;
x
⇒ x =
{
a = 1
field2 = 2
} Динамический индексирование также позволяет использовать произвольные строки, а не только допустимые идентификаторы Octave (обратите внимание, что это не работает в MATLAB):
a = "long field with spaces (and funny char$)";
x.a = 1;
x.(a) = 2;
x
⇒ x =
{
a = 1
long field with spaces (and funny char$) = 2
} Идентификатор предупреждения Octave:language-extension можно включить, чтобы предупредить об использовании данного метода. См. warning_ids.
Более реалистично, все функции, работающие со строками, могут использоваться для построения правильного имени поля перед его вводом в структуру данных.
names = ["Bill"; "Mary"; "John"];
ages = [37; 26; 31];
for i = 1:rows (names)
database.(names(i,:)) = ages(i);
endfor
database
⇒ database =
{
Bill = 37
Mary = 26
John = 31
} Третий способ создания структур — команда struct. struct принимает пары аргументов, где первый аргумент в паре — имя поля, которое нужно включить в структуру, а второй — скаляр или ячейковый массив, представляющий значения, которые нужно включить в структуру или массив структур. Например:
struct ("field1", 1, "field2", 2)
⇒ ans =
{
field1 = 1
field2 = 2
} Если значения, переданные struct, являются смесью скаляров и ячейковых массивов, то скалярные аргументы расширяются для создания массива структур с согласованным измерением. Например:
s = struct ("field1", {1, "one"}, "field2", {2, "two"},
"field3", 3);
s.field1
⇒
ans = 1
ans = one
s.field2
⇒
ans = 2
ans = two
s.field3
⇒
ans = 3
ans = 3 Если вы хотите создать структуру, содержащую ячейковый массив в качестве отдельного поля, вы должны заключить его в другой ячейковый массив, как показано в следующем примере:
struct ("field1", {{1, "one"}}, "field2", 2)
⇒ ans =
{
field1 =
{
[1,1] = 1
[1,2] = one
}
field2 = 2
} - s = struct ()
- s = struct (field1, value1, field2, value2, …)
- s = struct (obj)
-
Создаёт скалярную или массивовую структуру и инициализирует её значения.
Переменные field1, field2, … являются строками, определяющими имена полей, а переменные value1, value2, … могут быть любого типа.
Если значения являются ячейковыми массивами, создаётся массив структур и инициализируются его значения. Размеры каждого ячейкового массива значений должны совпадать. Одиночные ячейки и не-ячейковые значения повторяются так, чтобы заполнить весь массив. Если ячейки пусты, создаётся пустой массив структур с указанными именами полей.
Если аргумент является объектом, возвращается лежащая в основе структура.
Обратите внимание, что синтаксис оптимизирован для массивов структур. Рассмотрим следующие примеры:
struct ("foo", 1) ⇒ scalar structure containing the fields: foo = 1 struct ("foo", {}) ⇒ 0x0 struct array containing the fields: foo struct ("foo", { {} }) ⇒ scalar structure containing the fields: foo = {}(0x0) struct ("foo", {1, 2, 3}) ⇒ 1x3 struct array containing the fields: fooПервый случай — обычная скалярная структура: одно поле, одно значение. Во втором случае создаётся пустой массив структур с одним полем и без значений, так как передаётся пустой ячейковый массив значений массива структур. Когда значение является ячейковым массивом, содержащим один элемент, это становится скалярной структурой с этим единственным элементом в качестве значения поля. Этот единственный элемент оказывается пустым ячейковым массивом.
Наконец, если значение является нескалярным ячейковым массивом, то
structсоздаёт массив структур.См. также: cell2struct, fieldnames, getfield, setfield, rmfield, isfield, orderfields, isstruct, structfun.
Функция isstruct может использоваться для проверки, является ли объект структурой или массивом структур.
- isstruct (x)
-
Возвращает true, если x является структурой или массивом структур.
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/Creating-Structures.html