matlab结构体的创建与元素访问

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

参考文献

https://ww2.mathworks.cn/help/matlab/structures.html?searchHighlight=结构体&s_tid=doc_srchtitle

https://ww2.mathworks.cn/help/matlab/matlab_prog/create-a-structure-array.html

https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-a-structure-array.html

https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-nested-structures.html

https://ww2.mathworks.cn/help/matlab/matlab_prog/access-multiple-elements-of-a-nonscalar-struct-array.html

概念

  • 对于一个结构体而言,(1),(2),(3)...称为同一个结构体的不同元素,.1,.2,.3...称为一个结构体的属性
  • 带有可以包含各种类型和大小的数据的命名字段的数组
  • 结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。使用 structName.fieldName 格式的圆点表示法来访问结构体中的数据。

函数

创建结构体数组

  • 下面的示例说明了如何创建结构体数组。结构体是使用被称为字段的数据容器将相关数据组合在一起的一种数据类型。每个字段都可以包含任意类型或任意大小的数据。将患者记录存储在含有字段 name、billing 和 test 的标量结构体中

  • 数组中的每条患者记录都是 struct 类的结构体。由结构体构成的数组通常称为结构体数组。与其他 MATLAB 数组类似,结构体数组可以具有任意维度。
  • 结构体数组具有下列属性:
    • 数组中的所有结构体都具有相同数目的字段。
    • 所有结构体都具有相同的字段名称。
    • 不同结构体中的同名字段可包含不同类型或大小的数据。
    • 数组中新结构体的任何未指定字段均包含空数组。
patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
name: 'New Name'
billing: []
test: []

访问结构体中的元素

  • 结构体也分为标量结构体和结构体数组,结构体数组可以通过结构体数组的索引进行访问,而标量结构体可以通过结构体名称进行访问。

访问标量结构体

  • 要访问字段的一部分内容,请添加适合字段中数据的大小和类型的索引
  • 如果特定的字段包含 元胞数组 ,使用 花括号{} 访问数据

访问非标量结构体数组的属性

  • 通过将文件 mandrill.mat 中的数据加载到数组 S 的 第二个元素 中来创建一个 非标量数组
S(2) = load('mandrill.mat')
  • 一个结构体数组的每个元素都必须具有相同的字段。 clown.mat 和 mandrill.mat 都包含变量 X、map 和 caption。

S 是一个 1×2 的数组。

S =

  1×2 struct array with fields:

    X
map
caption

对于非标量结构体,访问特定字段的语法为 structName(indices).fieldName。 重新显示 clown 图像,并指定 clown 结构体的索引 (1):

image(S(1).X)
colormap(S(1).map)
添加索引以选择并重新显示字段内容的左上角: upperLeft = S(1).X(1:50,1:80);
image(upperLeft)

注意

仅当引用结构体数组的 单个元素 时,才能为字段的部分内容建立索引。 MATLAB® 不支持诸如 S(1:2).X(1:50,1:80) 的语句,后者尝试为结构体的多个元素的字段建立索引。

访问嵌套结构体中的数据

  • 此示例演示了如何为嵌套于另一个结构体中的结构体建立索引。访问特定字段中的数据的一般语法为

    `structName(index).nestedStructName(index).fieldName(indices)``
  • 当结构体为 标量 (1×1) 时,无需包括索引以引用单个元素。例如,创建一个标量结构体 s,其中字段 n 是一个嵌套的标量结构体,其中包含字段 a、b 和 c:
s.n.a = ones(3);
s.n.b = eye(4);
s.n.c = magic(5);
  • 访问字段 b 的第三行:
third_row_b = s.n.b(3,:)
变量 third_row_b 包含 eye(4) 的第三行。 third_row_b =
0 0 1 0
  • 扩展 s,以便 s 和 n 都为非标量 (1×2):
s(1).n(2).a = 2*ones(3);
s(1).n(2).b = 2*eye(4);
s(1).n(2).c = 2*magic(5); s(2).n(1).a = '1a';
s(2).n(2).a = '2a';
s(2).n(1).b = '1b';
s(2).n(2).b = '2b';
s(2).n(1).c = '1c';
s(2).n(2).c = '2c';
结构体 s 现在包含下图中所示的数据。

  • 访问 n(位于 s 的第一个元素中)的第二个元素的字段 b 中的数组部分内容:
part_two_eye = s(1).n(2).b(1:2,1:2)
这将返回 2*eye(4) 的左上角 2×2 的部分: part_two_eye =
2 0
0 2

访问非标量结构体数组的元素

  • 访问和处理一个非标量结构体数组的多个元素中的数据
  1. 创建一个1*3的结构体s,其中包含字段f:
s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);
  • 尽管数组中的 每个结构体必须具有相同的字段数和相同的字段名称,但字段的类型和大小可以不同 引用多个元素的同一字段 s(1:3).f 或者 s.f
  • matlab 以逗号分隔列表的形式返回元素中的数据
    ans =
    1 ans =
    two ans =
    3 3 3
    3 3 3
    3 3 3
    • 不能使用v=s.f语法将该列表分配给单个变量,因为各个字段包含的数据类型可能不同,但是可以 将列表项分配给相同数量的变量 或者 分配给元胞数组
    [v1, v2, v3] = s.f;
    c = {s.f};
  1. 如果所有字段均包含相同类型的数据并且可以构成超矩形,则可以串联列表项。例如,创建一个包含字段 f(具有数值标量)的结构体 nums,然后串联字段中的数据:
nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3; allNums = [nums.f]
该代码返回 allNums =
1 2 3
  1. 如果要使用相同运算处理数组的每个元素,请使用 arrayfun 函数。例如,统计数组 s 中每个结构体的字段 f 的元素数。
numElements = arrayfun(@(x) numel(x.f), s)
语法 @(x) 可以创建匿名函数。此代码对数组 s 的每个元素调用 numel 函数,例如 numel(s(1).f),并返回 numElements =
1 3 9

matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段的更多相关文章

  1. matlab学习笔记13_3创建函数句柄

    一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...

  2. matlab学习笔记(一)单元数组

    matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x)  :取最大的整数 ceil(3.18)=4,ceil( ...

  3. matlab学习笔记4--MAT文件的保存和读取

    一起来学matlab-matlab学习笔记4 数据导入和导出_1 MAT文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...

  4. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  5. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)——创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  6. 【数学建模】MATLAB学习笔记——函数式文件

    MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...

  7. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  8. matlab学习笔记---(1)

    Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...

  9. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

随机推荐

  1. Hadoop-HA集群搭建-rehl7.4

    Hadoop-HA集群搭建-rehl7.4 hadoop 无说明需要登录其它机器操作,都是在集群的HD-2-101上执行的命令. 所有安装包地址:百度网盘,提取码:24oy 1. 基础环境配置 1.1 ...

  2. SQL血的教训

    1.    每次查询的数据要有限制     2013年1月  产品独立数据库,由于多条SQL每次查询数据超过几千条,有些超过10万条数据未分页,造成应用服务器CPU有时持续100%. 2.    禁止 ...

  3. scratch2.0的教材视频,王木头系列

    在线视频 http://v.qq.com/vplus/d05a62f676f6f3b6b87401b4530cff9a?page=cover 理论辩证 https://www.sohu.com/a/1 ...

  4. js--同步运动json上

    如何实现几个属性的同时变化?这个问题需要运用到json,这里我们先来简要的介绍一下json json的形式是这样的,他的元素是有一对对的键值对组成的{name1:value1,name2:value2 ...

  5. nginx常用运维日志分析命令

    nginx常用日志分析命令 运维人员必备 常用日志分析命令 1.总请求数 wc -l access.log |awk '{print $1}' 2.独立IP数 awk '{print $1}' acc ...

  6. LeetCode 1091. Shortest Path in Binary Matrix

    原题链接在这里:https://leetcode.com/problems/shortest-path-in-binary-matrix/ 题目: In an N by N square grid, ...

  7. 优化sql技巧

    当表很大的时候可以设计冗余字段,避免与大表连表查询造成性能低下 比如日志表和用户表,日志表通常到后期会相当的大可以做一个username的冗余字段,避免查看username的时候去和user表关联 当 ...

  8. my OD

    1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Makefile 5 提交测试代码和运行 ...

  9. linux学习11 Linux基础命令及命令历史

    一.Linux系统上的文件类型 1.- :常规文件:在其它程序中用f表示.比如我们用ls -l命令查看的第一个内容 [root@localhost ~]# ls -l total -rw------- ...

  10. 各软件发布版本简写(Alpha Beta RC GA DMR)

    Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用. Beta:也是测试版,这个阶段的版本会一直加入新的功能.在Alpha版之后推出. RC:(Release Candi ...