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–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/v7.2.0/Creating-Structures.html