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 можно использовать, чтобы проверить, является ли объект структурой или массивом структур.
-
:
tf =isstruct(x) -
Возвращает true, если x является структурой или массивом структур.
© 1996–2026 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/v9.4.0/Creating-Structures.html