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)
-
Возвращает значение «истина», если 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/v6.4.0/Creating-Structures.html