matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段
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*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};
- 如果所有字段均包含相同类型的数据并且可以构成超矩形,则可以串联列表项。例如,创建一个包含字段 f(具有数值标量)的结构体 nums,然后串联字段中的数据:
nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3;
allNums = [nums.f]
该代码返回
allNums =
1 2 3
- 如果要使用相同运算处理数组的每个元素,请使用 arrayfun 函数。例如,统计数组 s 中每个结构体的字段 f 的元素数。
numElements = arrayfun(@(x) numel(x.f), s)
语法 @(x) 可以创建匿名函数。此代码对数组 s 的每个元素调用 numel 函数,例如 numel(s(1).f),并返回
numElements =
1 3 9
matlab学习笔记12_2创建结构体数组,访问标量结构体,访问非标量结构体数组的属性,访问嵌套结构体中的数据,访问非标量结构体数组中多个元素的字段的更多相关文章
- matlab学习笔记13_3创建函数句柄
一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...
- matlab学习笔记(一)单元数组
matlab学习笔记(一)单元数组 1.floor(x) :取最小的整数 floor(3.18)=3,floor(3.98)=3 ceil(x) :取最大的整数 ceil(3.18)=4,ceil( ...
- matlab学习笔记4--MAT文件的保存和读取
一起来学matlab-matlab学习笔记4 数据导入和导出_1 MAT文件的保存和读取 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- Django:学习笔记(2)——创建第一个应用
Django:学习笔记(2)——创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...
- 【数学建模】MATLAB学习笔记——函数式文件
MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- matlab学习笔记---(1)
Matlab学习笔记 一. Desktop Basics (Matlab 基础知识) 当你打开Matlab的时候,matlab按照以下默认的方式展示出来. 该桌面主要包括以下几部分内容: 当前文件夹: ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
随机推荐
- 将Quartz.NET集成到 Castle中
原文:https://cloud.tencent.com/developer/article/1030346 Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB ...
- 201671030102陈飞 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 1.掌握软件项目评审会议流程 ...
- 云打印 对Echo的Beta产品测试报告
云打印 对Echo的Beta产品测试报告 课程名称:软件工程1916|W(福州大学) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标:作业集合 团队队员 队员学号 队员姓名 个人博 ...
- curl多线程下载类
<?php /** * curl多线程下载类 */class MultiHttpRequest{ public $urls = array (); private $res = array () ...
- JSP学习之路
1.JSP默认Encoding编码格式设置:UTF-8
- selenium 2 设置浏览器安装路径
selenium 2由于调用的是真实的浏览器,所以当你的浏览器不是安装在默认路径下,你就需要设定浏览器启动路径:若是默认路径,则程序中不需设定浏览器启动路径. 比如说用firefox进行测试 1. f ...
- Linux定时任务crontab命令
linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于用户自己也可以设置计划任务,所以,Li ...
- 洛谷 P1731 [NOI1999]生日蛋糕 题解
每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...
- 1.Http讲解
1.什么是HTTP HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP上. 文本:html,字符串,.... 超文本:图片,音乐,视频,定位,地图... 80端口 HTTPS:安 ...
- 16-网页,网站,微信公众号基础入门(网页版MQTT,页面控件位置调整入门)
https://www.cnblogs.com/yangfengwu/p/11200767.html 说一下,只要你java学的很好,那么几乎所有的语言都不在话下了 来看一下样式设置 运行 在左上角感 ...