struct

结构体数组

全页展开

说明

结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。可以使用 structName.fieldName 格式的圆点表示法来访问字段中的数据。

创建对象

当您有数据要放入新的结构体中时,可以使用圆点表示法创建结构体,每次为结构体命名一个字段:

s.a = 1;
s.b = {'A','B','C'}
s = struct with fields:
    a: 1
    b: {'A'  'B'  'C'}

也可以按如下所述,使用 struct 函数创建一个结构体数组。您可以同时指定许多字段,也可以创建一个非标量结构体数组。

语法

s = struct

s = struct(field,value)

s = struct(field1,value1,...,fieldN,valueN)

s = struct([])

s = struct(obj)

说明

s = struct 创建不包含任何字段的标量 (1×1) 结构体。

示例

s = struct(field,value) 创建具有指定字段和值的结构体数组。value 输入参数可以是任何数据类型,例如数值、逻辑值、字符或元胞数组。

  • 如果 value 不是元胞数组,或者 value 是标量元胞数组,则 s 是标量结构体。例如,s = struct('a',[1 2 3]) 创建一个 1×1 结构体,其中 s.a = [1 2 3]

  • 如果 value 是非标量元胞数组,则 s 是维度与 value 相同的结构体数组。s 的每个元素包含 value 的对应元素。例如,s = struct('x',{'a','b'},'y','c') 返回 s(1).x = 'a's(2).x = 'b's(1).y = 'c' 和 s(2).y = 'c'

  • 如果 value 是空元胞数组 {},则 s 是空 (0×0) 结构体。

示例

s = struct(field1,value1,...,fieldN,valueN) 创建多个字段。集合 value1,...,valueN 中的任何非标量元胞数组必须具有相同的维度。

  • 如果 value 的所有输入都不是元胞数组,或者 value 中作为元胞数组的所有输入都是标量,则 s 是标量结构体。

  • 如果所有 value 输入都是非标量元胞数组,则 s 具有与非标量元胞数组相同的维度。对于类型为标量元胞数组或任何其他数据类型的数组的任何 valuestruct 将 value 的内容插入 s 的所有元素的相关字段中。

  • 如果任何 value 输入是空元胞数组 {},则输出 s 是空 (0×0) 结构体。要指定一个空字段并保留其他字段的值,请改用 [] 作为 value 输入。

s = struct([]) 创建不包含任何字段的空 (0×0) 结构体。

s = struct(obj) 创建包含与 obj 的属性对应的字段名称和值的标量结构体。struct 函数不会转换 obj,而是将 s 创建为一个新的结构体。此结构体不保留类信息,因此专用、受保护和隐藏的属性在 s 中变为公共字段。struct 函数在您使用此语法时会发出警告。

输入参数

全部折叠

field - 字段名称
字符向量

字段名称,指定为字符向量。有效字段名称以字母开头,可以包含字母、数字和下划线。字段名称的最大长度是 namelengthmax 函数返回的值。

value - 值
数组

值,指定为任何类型的数组。如果 value 有任何输入是非标量元胞数组,则所有非标量元胞数组输入必须具有相同的维度。

如果 value 有任何输入是空元胞数组 {},则输出是空结构体数组。要指定单个空字段,请使用 []

obj - 对象
标量 | 数组

对象,指定为标量或对象数组。struct 函数将 obj 的属性复制到新标量结构体的字段中。大部分基本数据类型(例如 double 或 char)都不受支持。请参阅MATLAB 基础类获得基本数据类型的列表。

示例

全部折叠

在结构体中存储相关数据变量

打开实时脚本

在结构体的字段中存储相关数据片段。您可以为这些字段提供对数据进行描述的易读名称。

通过使用圆点表示法添加字段来创建一个结构体。这些字段包含正弦波的 x 值和 y 值以及描述数据的文本。

data.x = linspace(0,2*pi);
data.y = sin(data.x);
data.title = 'y = sin(x)'
data = struct with fields:
        x: [1x100 double]
        y: [1x100 double]
    title: 'y = sin(x)'

绘制正弦波。您可以按字段名称引用 x 和 y 值的数组。然后添加标题。

plot(data.x,data.y)
title(data.title)

具有一个字段的结构体

打开实时脚本

创建包含一个字段的非标量结构体。

field = 'f';
value = {'some text';
         [10, 20, 30];
         magic(5)};
s = struct(field,value)
s = 3x1 struct array with fields:
    f

查看每个元素的内容。

s.f
ans = 
'some text'
ans = 1×3

    10    20    30

ans = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

访问非标量结构体的字段(例如 s.f)时,MATLAB® 返回一个逗号分隔的列表。在本示例中,s.f 等效于 s(1).f, s(2).f, s(3).f

具有多个字段的结构体

打开实时脚本

创建包含多个字段的非标量结构体。

field1 = 'f1';  value1 = zeros(1,10);
field2 = 'f2';  value2 = {'a', 'b'};
field3 = 'f3';  value3 = {pi, pi.^2};
field4 = 'f4';  value4 = {'fourth'};

s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
s = 1x2 struct array with fields:
    f1
    f2
    f3
    f4

value2 和 value3 的元胞数组是 1×2 数组,因此 s 也是 1×2 数组。因为 value1 是数值数组而不是元胞数组,所以 s(1).f1 和 s(2).f1 具有相同的内容。类似地,因为 value4 的元胞数组具有单一元素,所以 s(1).f4 和 s(2).f4 具有相同的内容。

s(1)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'a'
    f3: 3.1416
    f4: 'fourth'

s(2)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'b'
    f3: 9.8696
    f4: 'fourth'

带有空字段的结构体

打开实时脚本

创建包含一个空字段的结构体。使用 [] 指定空字段的值。

s = struct('f1','a','f2',[])
s = struct with fields:
    f1: 'a'
    f2: []

包含元胞数组的字段

打开实时脚本

创建具有一个字段的一个结构体,该字段包含一个元胞数组。

field = 'mycell';
value = {{'a','b','c'}};
s = struct(field,value)
s = struct with fields:
    mycell: {'a'  'b'  'c'}

空结构体

打开实时脚本

创建包含多个字段的空结构体。

s = struct('a',{},'b',{},'c',{})
s = 

  0x0 empty struct array with fields:

    a
    b
    c

为空结构体中的字段赋值。

s(1).a = 'a'
s = struct with fields:
    a: 'a'
    b: []
    c: []

嵌套结构体

打开实时脚本

创建一个嵌套结构体,其中 a 是具有一个字段的结构体,该字段又包含另一个结构体。

a.b = struct('c',{},'d',{})
a = struct with fields:
    b: [0x0 struct]

查看 a.b 的字段的名称。

fieldnames(a.b)
ans = 2x1 cell array
    {'c'}
    {'d'}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐