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. SaltStack--数据系统

    saltstack数据系统 数据系统Grains 1.Grains是SaltStack收集的有关底层管理系统的静态信息.包括操作系统版本.域名.IP地址.内存.内核.CPU.操作系统类型以及许多其他系 ...

  2. httprunner学习15-运行用例命令行参数详解

    前言 HttpRunner 在命令行中启动测试时,通过指定参数,可实现丰富的测试特性控制. 命令行参数CLI 使用 -h 查看相关命令行参数 hrun -h 参数名称 参数值 参数说明 -h, --h ...

  3. GStreamer: your gstreamer installation is missing a required plugin in funct

    # yum install gstreamer-plugins-* //问题依旧 别人回答: 编解码不对应? 我印象中GStreamer解码器分什么good,bad 取决你要读什么媒体,需要装些插件的 ...

  4. 项目Beta冲刺(7/7)(追光的人)(2019.5.29)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

  5. 2019牛客暑期多校训练营(第六场)C:Palindrome Mouse(回文树+树剖)

    题意:给定字符串Str,求出回文串集合为S,问S中的(a,b)满足a是b的子串的对数. 思路:开始和题解的思路差不多,维护当前后缀的每个串的最后出现位置,但是不知道怎么套“最小回文分割”,所以想到了树 ...

  6. A A=new A();

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  7. 20182310 第二周&第三周学习总结

    20182310 2019-2020-1 <数据结构与面向对象程序设计>第2周&第3周学习总结 教材学习内容总结 1.首先是String类定义的字符串,然后是print和print ...

  8. UiAutomatorViewer无法获取手机截图进行元素定位的解决办法

    问题描述 本来想使用UIAutomatorView定位app页面元素的,最开始我使用的是夜神模拟器,打开UIAutomatorView连接模拟器没有问题,但是后来我使用真机时发现无法连接到真机获取真机 ...

  9. Linux正则表达式与通配符

    在linux中,有通配符和正则表达式,这是两个不同的概念通配符:它是由shell解析,并且一般用于匹配文件名.如:ls正则表达式:是一个字符匹配标准,可以匹配文本中的内容一些命令工具按此标准实现字符匹 ...

  10. CCF 201909-3 字符画

    CCF 201909-3 字符画 题意: 将n * m的RGB图片压缩成q * p的块,每块为该原像素的平均值,我们暂且称之为像素块(代码注释为字符块) . 输入n行m列的RGB图片: 第一行:图片的 ...