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 можно использовать для проверки, является ли объект структурой или массивом структур.
© 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/v8.1.0/Creating-Structures.html