下面给出了可以操作结构体字段的其他函数。
n = numfields (s) ¶返回结构体 s 的字段数量。
参见: fieldnames。
names = fieldnames (struct) ¶names = fieldnames (obj) ¶names = fieldnames (javaobj) ¶names = fieldnames ("javaclassname") ¶返回一个字符串元胞数组,其中包含指定输入中的字段名称。
当输入是一个结构体 struct 时,names 是结构体的元素。
当输入是一个 Octave 对象 obj 时,names 是对象的公共属性。
当输入是一个 Java 对象 javaobj 或包含 Java 类名称的字符串 javaclassname 时,names 是该对象或类的公共字段(数据成员)。
参见: numfields, isfield, orderfields, struct, properties。
tf = isfield (x, "name") ¶tf = isfield (x, name) ¶如果 x 是一个结构体并且包含名为 name 的元素,则返回 true。
如果 name 是一个字符串元胞数组,则返回一个等维度的逻辑数组。
参见: fieldnames。
sout = setfield (s, field, val) ¶sout = setfield (s, sidx1, field1, fidx1, sidx2, field2, fidx2, …, val) ¶返回结构体 s 的一个副本,其中字段成员 field 被设置为值 val。
例如:
s = struct (); s = setfield (s, "foo bar", 42);
这等价于
s.("foo bar") = 42;
请注意,普通的结构体语法 s.foo bar = 42 不能在此处使用,因为字段名称中含有空格字符,不是有效的 Octave 标识符。对字段名使用任意字符串与 MATLAB 不兼容,如果启用了警告 ID Octave:language-extension,则会发出警告。请参见 warning_ids。
使用第二种调用形式,可以设置结构体数组的字段。输入 sidx 选择结构体数组的一个元素,field 指定所选元素的字段名称,fidx 选择字段中的哪个元素(在数组或元胞数组的情况下)。sidx、field 和 fidx 输入可以重复使用,以处理嵌套的结构体数组元素。结构体数组索引和字段元素索引必须是元胞数组,而字段名称必须是字符串。
例如:
s = struct ("baz", 42);
setfield (s, {1}, "foo", {1}, "bar", 54)
⇒
ans =
scalar structure containing the fields:
baz = 42
foo =
scalar structure containing the fields:
bar = 54
该示例从一个普通的标量结构体开始,并向其中添加了一个嵌套的标量结构体。在所有情况下,如果结构体索引 sidx 未指定,则默认为 1(标量结构体)。因此,上面的例子可以更简洁地写为 setfield (s, "foo", "bar", 54)。
最后,一个包含嵌套结构体数组的示例:
sa.foo = 1;
sa = setfield (sa, {2}, "bar", {3}, "baz", {1, 4}, 5);
sa(2).bar(3)
⇒
ans =
scalar structure containing the fields:
baz = 0 0 0 5
这里 sa 是一个结构体数组,其元素 1 和 2 处的字段依次是另一个结构体数组,该结构体数组的第三个元素是一个简单的标量结构体。最内层的标量结构体有一个包含矩阵值的字段。
请注意,可以通过以下方式获得与上述示例相同的结果:
sa.foo = 1; sa(2).bar(3).baz(1,4) = 5
参见: getfield, rmfield, orderfields, isfield, fieldnames, isstruct, struct。
val = getfield (s, field) ¶val = getfield (s, sidx1, field1, fidx1, …) ¶从结构体或嵌套结构体 s 中获取名为 field 的字段的值。
如果 s 是结构体数组,则 sidx 选择结构体数组的一个元素,field 指定所选元素的字段名称,fidx 选择字段中的哪个元素(在数组或元胞数组的情况下)。有关语法的更完整描述,请参见 setfield。
参见: setfield, rmfield, orderfields, isfield, fieldnames, isstruct, struct。
sout = rmfield (s, "f") ¶sout = rmfield (s, f) ¶返回结构体(数组)s 的一个副本,其中移除了字段 f。
如果 f 是字符串元胞数组或字符数组,则移除所有指定的命名字段。
参见: orderfields, fieldnames, isfield。
sout = orderfields (s1) ¶sout = orderfields (s1, s2) ¶sout = orderfields (s1, {cellstr}) ¶sout = orderfields (s1, p) ¶[sout, p] = orderfields (…) ¶返回 s1 的一个副本,其中的字段按字母顺序排列,或按第二个输入指定的顺序排列。
如果只给定一个输入结构体 s1,则按字母顺序排列字段名称。
如果给出了第二个结构体参数,则将 s1 中的字段名称按照它们在 s2 中出现的顺序排列。第二个参数也可以是一个字符串元胞数组 cellstr,用于指定顺序。第二个参数还可以是一个排列向量。
可选的第二个输出参数 p 是一个排列向量,它将原始名称顺序转换为新的名称顺序。
示例:
s = struct ("d", 4, "b", 2, "a", 1, "c", 3);
t1 = orderfields (s)
⇒ t1 =
scalar structure containing the fields:
a = 1
b = 2
c = 3
d = 4
t = struct ("d", {}, "c", {}, "b", {}, "a", {});
t2 = orderfields (s, t)
⇒ t2 =
scalar structure containing the fields:
d = 4
c = 3
b = 2
a = 1
t3 = orderfields (s, [3, 2, 4, 1])
⇒ t3 =
scalar structure containing the fields:
a = 1
b = 2
c = 3
d = 4
[t4, p] = orderfields (s, {"d", "c", "b", "a"})
⇒ t4 =
scalar structure containing the fields:
d = 4
c = 3
b = 2
a = 1
p =
1
4
2
3
参见: fieldnames, getfield, setfield, rmfield, isfield, isstruct, struct。
s = substruct (type, subs, …) ¶创建一个用于 subsref 或 subsasgn 的下标结构体。
例如:
idx = substruct ("()", {3, ":"})
⇒ idx =
scalar structure containing the fields:
type = ()
subs =
{
[1,1] = 3
[1,2] = :
}
x = [1, 2, 3;
4, 5, 6;
7, 8, 9];
subsref (x, idx)
⇒ 7 8 9
注意:关键字 end 不能在 subsref 或 subsasgn 的索引赋值中使用。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2