zoukankan      html  css  js  c++  java
  • matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12

    12_3 结构体

    串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    觉得有用的话,欢迎一起讨论相互学习~Follow Me

    参考文献
    https://ww2.mathworks.cn/help/matlab/matlab_prog/concatenate-structures.html
    https://ww2.mathworks.cn/help/matlab/ref/struct.html#d117e1320181
    https://ww2.mathworks.cn/help/matlab/ref/fieldnames.html
    https://ww2.mathworks.cn/help/matlab/ref/isfield.html
    https://ww2.mathworks.cn/help/matlab/ref/isstruct.html
    https://ww2.mathworks.cn/help/matlab/ref/orderfields.html

    串联结构体

    • 要串联结构体,他们必须具有相同的字段集,但这些字段无需包含相同的大小或数据类型。
    • 创建标量 (1×1) 结构体数组 struct1 和 struct2,并且每个数组都具有字段 a 和 b
    struct1.a = 'first';
    struct1.b = [1,2,3];
    struct2.a = 'second';
    struct2.b = rand(5);
    struct1,struct2
    struct1 = struct with fields:
        a: 'first'
        b: [1 2 3]
    
    struct2 = struct with fields:
        a: 'second'
        b: [5x5 double]
    
    • 正如串联两个标量值(如 [1,2])会创建一个 1×2 数值数组一样,串联 struct1 和 struct2 也会创建一个 1×2 结构体数组
    combined = [struct1,struct2]
    combined = 1x2 struct array with fields:
        a
        b
    
    • 当要访问特定字段的内容时,请指定数组中的结构体的索引。例如,访问第一个结构体的字段 a。
    combined(1).a
    ans =
    'first'
    
    • 串联也适用于非标量结构体数组。例如,创建一个名为 new 的 2×2 结构体数组。由于 1×2 结构体 combined 和 2×2 结构体 new 都包含两列,因此您可以使用分号分隔符垂直串联它们。
    new(1,1).a = 1;
    new(1,1).b = 10;
    new(1,2).a = 2;
    new(1,2).b = 20;
    new(2,1).a = 3;
    new(2,1).b = 30;
    new(2,2).a = 4;
    new(2,2).b = 40;
    
    larger = [combined; new]
    larger = 3x2 struct array with fields:
        a
        b
    
    • 访问结构体 larger(2,1) 的字段 a。它与 new(1,1).a 包含相同的值。
    larger(2,1).a
    ans = 1
    

    按属性创建含有元胞数组的结构体

    • 可以直接使用"."的方式向一个结构体添加属性,例如a.b即向a结构体中添加属性b
    • 使用构造函数的方式
      • s = struct(field,value)
      • s = struct(field1,value1,...,fieldN,valueN)
    创建包含多个字段的非标量结构体。
    
    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'
    
    

    filenames

    • fields = fieldnames(S) 返回结构体数组S的字段名称。
    创建一个结构体数组。
    
    S(1,1).x = linspace(0,2*pi);
    S(1,1).y = sin(S(1,1).x);
    S(1,1).title = 'y = sin(x)';
    S(2,1).x = linspace(0,2*pi);
    S(2,1).y = cos(S(2,1).x);
    S(2,1).title = 'y = cos(x)'
    S = 2x1 struct array with fields:
        x
        y
        title
    
    • 使用 fieldnames 函数返回元胞数组中的字段名称。
    fields = fieldnames(S)
    fields = 3x1 cell array
        {'x'    }
        {'y'    }
        {'title'}
    
    • 要返回字段的值,请使用 struct2cell 函数。 struct2cell 和 fieldnames 以相同的顺序返回值和字段名称。
    values = struct2cell(S)
    values = 3x2 cell array
        {1x100 double}    {1x100 double}
        {1x100 double}    {1x100 double}
        {'y = sin(x)'}    {'y = cos(x)'}
    

    isfield

    • 确定输入是否为结构体数组字段
    • TF = isfield(S,field)
    • 如果 field 是结构体数组 S 的一个字段的名称,则 TF = isfield(S,field) 返回 1。否则,将返回 0
    • 如果 field 是包含多个名称的数组,则 TF 是大小相同的逻辑数组。

    isstruct

    • 确定输入是否为结构体数组
    • tf = isstruct(A)
    • 如果 A 为 MATLAB的结构体,则 tf = isstruct(A) 返回逻辑值1(true);否则返回逻辑值0(false)。

    orderfields

    • 结构体数组的顺序字段

    语法

    • S = orderfields(S1)
      • S = orderfields(S1) 按名称对 S1 中的字段排序。
        由于字段名称只能包含字母、数字和下划线,此语法按 ASCII 顺序对字段名称进行排序。所有大写字母排在所有小写字母之前。
    创建一个包含多个字段的结构体。
    
    S1 = struct('b',1,'B',2,'a',3,'A',4)
    S1 = struct with fields:
        b: 1
        B: 2
        a: 3
        A: 4
    
    对字段排序。此语法基于 ASCII 顺序按字段名称对字段排序。
    
    S = orderfields(S1)
    S = struct with fields:
        A: 4
        B: 2
        a: 3
        b: 1
    
    • S = orderfields(S1,S2)
      • S = orderfields(S1,S2) 返回 S1 的副本,其字段已重新排序以匹配 S2 的字段顺序。输入结构体数组 S1 和 S2 必须具有相同的字段名称。
    创建两个结构体,它们具有相同字段,只是字段顺序不同。字段名称相同,但字段值不同。
    
    S1 = struct('b',1,'B',2,'a',3,'A',4)
    S1 = struct with fields:
        b: 1
        B: 2
        a: 3
        A: 4
    
    S2 = struct('a',0,'b',20,'B',10,'A',0)
    S2 = struct with fields:
        a: 0
        b: 20
        B: 10
        A: 0
    
    对 S1 中的字段进行排序以匹配 S2 中的字段顺序。
    
    S = orderfields(S1,S2)
    S = struct with fields:
        a: 3
        b: 1
        B: 2
        A: 4
    
    • S = orderfields(S1,C)
      • S = orderfields(S1,C) 按输入数组 C 匹配名称顺序。S1 中每个字段的名称必须在 C 中出现一次。
    创建一个结构体。
    
    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)'
    
    通过以元胞数组形式列出字段名称来对字段排序。
    
    C = {'title','x','y'};
    data = orderfields(data,C)
    data = struct with fields:
        title: 'y = sin(x)'
            x: [1x100 double]
            y: [1x100 double]
    
    
    • S = orderfields(S1,P)
      • S = orderfields(S1,P) 按置换向量 P 匹配顺序。
        如果 S1 有 n 个字段,则 P 的元素是从 1 到 n 的整数,按任意顺序排列。例如,如果 S1 有三个字段,P 是 [3 1 2],则 S1 的第三个字段是输出 S 的第一个字段。当需要以相同的方式对多个结构体数组进行排序时,此语法非常有用。
    创建一个结构体。
    
    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)'
    
    通过以另一顺序列出字段的原始位置来对字段排序。例如,移动第三个字段,使其成为输出结构体的第一个字段。
    
    P = [3 1 2];
    data = orderfields(data,P)
    data = struct with fields:
        title: 'y = sin(x)'
            x: [1x100 double]
            y: [1x100 double]
    
    
  • 相关阅读:
    ubuntu 14.04 (desktop amd 64) 下载
    ubuntu16.04 server(amd 64) 下载
    vim/vi中移动光标键会变成A,B,C,D的解决办法
    ubuntu 14.04(desktop amd 64) nginx 安装启动停止
    ubuntu-server14.04 网络配置
    selenium-chrome-headless
    selenium-firefox-headless
    哈希表-java
    冒泡排序-java
    wc的使用
  • 原文地址:https://www.cnblogs.com/cloud-ken/p/11785929.html
Copyright © 2011-2022 走看看