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.
Обратите внимание, что синтаксис оптимизирован для массивов struct. Рассмотрим следующие примеры:
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 может быть использована для проверки, является ли объект структурой или массивом структур.
© 1996–2023 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.2.0/Creating-Structures.html