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
        }

警告idOctave:language-extension可以启用以警告这种用法。详见警告_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是标量和cellarray的混合,然后扩展标量参数以创建具有一致维度的结构体数组。例如

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 ("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可用于测试对象是structure还是structure数组。

 
: tf = isstruct (x)

如果返回truex是结构体或结构体数组。

详见: ismatrix, iscell, isa.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2