Matlab 结构体(struct)学习
http://blog.csdn.net/wangzhix123/article/details/8807737
在matlab里面,struct结构体数组功能强大,在处理很多复杂数据上很有用,刚好最近需要用到,顺便学习总结一下。
1,什么是结构体?
简单的说,结构体是一个可包含不同数据类型的结构。可以在一个结构体中声明不同的数据类型,这点跟数据区别很大,也是它优势的体现。举一个例子来说,比如班里面有53个学生,每个学生有学号,名字,性别等三个身份特征,那么我们可以用结构体来描述这53个学生,每个学生是一个结构体,结构体含有三个字段,分别是‘学号’,‘名字’,‘性别’。这样由53个结构体组成的一个大的结构体便可以表示这53个学生。例如,student(‘number’,‘name’,‘sex’)
2 ,如何定义结构体
MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。
2.1. 使用直接引用方式定义结构
与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个上面的学生:
student.number = 2013001; % 创建字段名为number,并为该字段赋值为2013001
student.name ='王尼玛' % 为student创建一个新的字段name,并为该字段赋值‘王尼玛’
student.sex ='female' % 为student创建一个新的字段female,并为该字段赋值‘female’
student =
number: 2013001
name: '王尼玛'
sex:female
然后可以将旗动态扩充为数组:
student(2).number = 2013002; % 将student扩充为1×2的结构数组
student(2).name =‘曹尼玛’;
在任何需要的时候,也可以为数组动态扩充字段,如增加字段age:
student(1).age = 18;
这样,所有student都增加了一个age字段,而student(1)之外的其他变量的age字段为空:
student(1) % 查看结构数组的第一个元素的各个字段的内容
ans =
number: 2013001
name: '王尼玛'
sex:female
age: 18
student(2) % 查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空
ans =
number: 2013001
name: '曹尼玛'
sex:[]
age: []
应该注意的是,student的number、name、age字段不一定是单个数据元素,它们可以是任意数据类型,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。
数组中不同元素的同一字段的数据类型也不要求一样;甚至还可以通过引用数组字段来定义结构数据类型的某字段。
2.2 使用struct函数创建结构
使用struct函数也可以创建结构,该函数产生或吧其他形式的数据转换为结构数组。
struct的使用格式为:
s = sturct('field1',values1,'field2',values2,…);
该函数将生成一个具有指定字段名和相应数据的结构数组,其包含的数据values1、valuese2等必须为具有相同维数的数据,数据的存放位置域其他结构位置一一对应的。对于struct的赋值用到了元胞数组。数组values1、values2等可以是元胞数组、标量元胞单元或者单个数值。每个values的数据被赋值给相应的field字段。
当valuesx为元胞数组的时候,生成的结构数组的维数与元胞数组的维数相同。而在数据中不包含元胞的时候,得到的结构数组的维数是1×1的。例如:
s = struct('number',{'2013001','2013002'},'name',{'王尼玛','曹尼玛'},'sex',{’female‘,‘male’})
s =
1x2 struct array with fields:
number
name
sex
得到维数为1×2的结构数组s,包含了number、name和sex共3个字段。其中,我们在matlab里面创建很多struct并大量赋值的时候,可能经常会遇到这样的提示,
The variable 'xx' appears to change size on every loop iteration (within a script).Consider preallocating for speed.
这种因为在循环里动态增加结构体而导致效率低下的问题就可以通过事先定义来解决,如:
a=cell(1,500)% 具体大小可根据实际需求来定
student=struct(‘name’,a,'number',a)
则会得到一个1*500的结构体。
3,如何操作结构体
MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。
表4.3.1 结构数组的操作函数
函数名 功能描述 函数名 功能描述
deal 把输入处理成输出 fieldnames 获取结构的字段名
getfield 获取结构中指定字段的值 rmfield 删除结构的字段(不是字段内容)
setfield 设置结构数组中指定的字段的值 struct 创建结构数组
struct2cell 结构数组转化成元胞数组 isfield 判断是否存在该字段
isstruct 判断某变量是否是结构类型
Matlab 结构体(struct)学习相关推荐
- 转载:[Matlab]结构体(Struct)
转载:https://blog.csdn.net/m0_37407756/article/details/70045209 要在MALTAB中实现比较复杂的编程,就不能不用struct类型.而且在MA ...
- go struct 静态函数_Go语言学习笔记(四)结构体struct 接口Interface 反射reflect...
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- golang 学习(二十四)结构体struct 和 json之间的转换
结构体struct 和 json之间的转换 import ("encoding/json""fmt""math/rand""tes ...
- matlab 结构体 单元数组,matlab结构体、数组和单元数组类型的创建
matlab结构体.数组和单元数组类型的创建 @ matlab结构体类型 通过字段赋值创建结构体 创建格式: 结构体名称.字段名称 样例: >> student.name='Alan'; ...
- Matlab 结构体之间相同字段的赋值
Matlab 结构体之间相同字段的赋值 假设有两个结构体 main_subject 和 all_subject .其中 main_subject 中包含了某位同学的主修成绩和学号姓名信息,需要将这些信 ...
- linux 结构体 struct addrinfo 简介
目录 定义 相关方法 1. getaddrinfo(const char, const char, const struct addrinfo, struct addrinfo*) 2. freead ...
- 结构体struct timeval 和 struct timespec的定义
结构体struct timeval 和 struct timespec的定义均在头文件<sys/time.h>中,具体定义如下: struct timeval {long tv_sec; ...
- Golang结构体struct的使用(结构体嵌套, 匿名结构体等)
转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...
- linux sock结构体,struct socket结构体详解
在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题. 由这个图可知,内核中的进程可以通过使用struct ...
- 内核中用于数据接收的结构体struct msghdr
我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...
最新文章
- K-Means聚类算法原理
- 【微软出品】AI-神经网络基本原理简明教程
- YII2框架表单-model(验证)-HTML_help部件 URL_help部件 以注册页面为实例
- QC中设置组权限-隐藏筛选器
- 各个大厂的机器学习平台概述
- ***ECharts图表入门和最佳实践
- oracle数据库 append,oracle中insert,copy,insert append执行对比
- FreeMarker 语法
- 每日一道shell练习(09)——sed处理
- 一个简单CI/CD流程的思考
- mysql查询字段数据是否有空格_mysql查询条件字段值末尾有空格也能查到数据问题...
- CODEVS 3027 线段覆盖2
- 学计算机仓库管理一定打字吗,仓库管理员要会电脑吗?需要哪些电脑操作呢?...
- 对可道云KodExplorer去掉版权简单破解方法
- 摸底10余家一线互联网公司大数据架构图:Hadoop渗透力太强!
- python求两数最小公倍数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...
- 一次看过瘾!中国摩博会的“钢铁怪兽”你最爱哪辆?
- 0x00007FFEB5D49149 处(位于 Project1.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000
- IOS开发之 ---- 苹果系统代码汉字转拼音
- 一个Android下ping的简单工具类