通信系统仿真

崔春雷

目录

  • 1 第一单元: MATLAB基础
    • 1.1 课程说明与资料
      • 1.1.1 作业参考答案
      • 1.1.2 移动22级作业答案
    • 1.2 MATLAB安装与运行环境
      • 1.2.1 MATLAB介绍
    • 1.3 基本数据类型:数值类型
    • 1.4 基本数据类型:字符类型
    • 1.5 数据类型转换与输出
    • 1.6 数组与矩阵基础
      • 1.6.1 矩阵运算进阶
    • 1.7 数组与矩阵常用函数
    • 1.8 matlab中的逻辑运算
    • 1.9 实验: MATLAB常用数学函数
      • 1.9.1 实验 作业答案
    • 1.10 元胞数组
    • 1.11 结构体数组
      • 1.11.1 结构体进阶
      • 1.11.2 元胞数组与结构体数组对比
      • 1.11.3 map 容器
    • 1.12 附录:MATLAB常用基础命令
    • 1.13 拓展内容:实时脚本
      • 1.13.1 实时脚本示例
    • 1.14 课程作业与答案
      • 1.14.1 《通信系统仿真》期末考试
  • 2 第二单元:Matlab 程序设计
    • 2.1 顺序结构程序
    • 2.2 分支结构—— if语句
    • 2.3 分支结构—— switch语句
    • 2.4 循环结构—— while语句
    • 2.5 循环结构—— for语句
    • 2.6 图像处理基础
    • 2.7 Matlab的函数
      • 2.7.1 函数内容的课外扩展
    • 2.8 本章实验:for循环的应用
      • 2.8.1 素数问题
        • 2.8.1.1 素数的螺旋线排列
      • 2.8.2 3X+1猜想
      • 2.8.3 7 行代码计算 π
    • 2.9 排序算法
      • 2.9.1 冒泡排序
      • 2.9.2 选择排序
      • 2.9.3 插入排序
      • 2.9.4 快速排序
      • 2.9.5 基数排序
      • 2.9.6 计数排序
      • 2.9.7 堆排序
    • 2.10 动态规划算法
      • 2.10.1 动态规划编程实例
      • 2.10.2 动态规划:01背包问题
      • 2.10.3 动态规划常见题目分析
      • 2.10.4 动态规划题目分析2
    • 2.11 常用算法简介
      • 2.11.1 剪枝算法
      • 2.11.2 二分查找
      • 2.11.3 递归算法
      • 2.11.4 回溯算法
        • 2.11.4.1 Leetcode回溯题目合集
        • 2.11.4.2 回溯算法总结
        • 2.11.4.3 回溯法解数独问题
        • 2.11.4.4 DFS与BFS
          • 2.11.4.4.1 DFS/BFS原理
          • 2.11.4.4.2 BFS的应用:Dijkstra算法
      • 2.11.5 n 皇后问题专题
      • 2.11.6 双指针算法
      • 2.11.7 数组模拟链表(约瑟夫环)
      • 2.11.8 Hash(哈希表)
      • 2.11.9 图论与路径规划
        • 2.11.9.1 迪杰斯特拉算法
        • 2.11.9.2 A*算法
          • 2.11.9.2.1 A*算法的MATLAB实现
        • 2.11.9.3 RRT路径规划算法
          • 2.11.9.3.1 RRT算法 MATLAB代码
          • 2.11.9.3.2 参考资料
      • 2.11.10 数据结构
        • 2.11.10.1 数据结构例题
      • 2.11.11 前缀和 差分 双指针
      • 2.11.12 位运算
      • 2.11.13 常用算法代码模板
    • 2.12 练习题库
    • 2.13 code
      • 2.13.1 简易计算器gui代码
      • 2.13.2 五子棋
      • 2.13.3 连连看小游戏
      • 2.13.4 递归算法与汉诺塔
      • 2.13.5 有理数的小数循环节
    • 2.14 MATLAB编程风格
      • 2.14.1 向量化编程专题
  • 3 第三单元:Matlab 图形图像处理
    • 3.1 二维图形绘图基础
    • 3.2 二维图形绘图进阶
    • 3.3 三维图形绘图
      • 3.3.1 MATLAB绘图小结
        • 3.3.1.1 用matlab绘制好看图像
    • 3.4 MATLAB高级绘图
    • 3.5 文件操作
    • 3.6 Matlab图像处理进阶
      • 3.6.1 补充:Matlab图像处理常用函数
      • 3.6.2 RGB/HSV/HSI颜色模型
      • 3.6.3 图片切换动画效果
      • 3.6.4 图像连通域标记
      • 3.6.5 图像旋转与插值
      • 3.6.6 图像的形态学
      • 3.6.7 空间滤波
        • 3.6.7.1 图像中常见的噪声类型与滤波方法
        • 3.6.7.2 matlab中的滤波函数
        • 3.6.7.3 BM3D 去噪算法
        • 3.6.7.4 双边滤波
      • 3.6.8 图像的频域处理
    • 3.7 本章总结
    • 3.8 实验 : matlab 绘图练习1
    • 3.9 实验: matlab 绘图练习2
    • 3.10 实验 :数学函数图像绘制
    • 3.11 实验:绘图综合练习
    • 3.12 实验:曲线拟合
    • 3.13 实验:牛顿法求解方程的根
    • 3.14 实验:信号的傅里叶变换
      • 3.14.1 傅里叶变换、小波变换、希尔伯特变换
      • 3.14.2 新建目录
    • 3.15 课外补充:图像处理基础1
    • 3.16 课外补充:图像处理基础2
    • 3.17 课外补充:图像处理基础3
    • 3.18 课外补充:PYTHON基础
  • 4 第五单元:MATLAB通信仿真
    • 4.1 现代通信系统的介绍
    • 4.2 模拟通信系统的仿真原理
    • 4.3 HDB3编解码的仿真实现
    • 4.4 SIMULINK和其模块简介
    • 4.5 数字通信系统的仿真原理
    • 4.6 模拟通信系统Simulink仿真
    • 4.7 数字通信系统Simulink仿真
    • 4.8 音频信号测处理与仿真
    • 4.9 图像数字水印技术
      • 4.9.1 三角函数到傅里叶变换再到语音识别与数字水印
    • 4.10 信息系统与算法
      • 4.10.1 递归算法
        • 4.10.1.1 递归与堆栈的关系
      • 4.10.2 哈希表
      • 4.10.3 双指针算法
        • 4.10.3.1 双指针算法实战
        • 4.10.3.2 双指针进阶:滑动窗口算法
      • 4.10.4 字符串匹配 KMP算法
        • 4.10.4.1 字符串匹配B-M算法
      • 4.10.5 快速傅里叶变换
      • 4.10.6 回溯算法
      • 4.10.7 动态规划
      • 4.10.8 分治算法
      • 4.10.9 Dijkstra算法
  • 5 第六单元: systemview通信仿真
    • 5.1 SystemView概述
    • 5.2 模拟通信系统 数字系统的仿真分析
    • 5.3 SystemView通信系统仿真进阶
    • 5.4 新建课程目录
  • 6 第四单元:MATLAB高级应用
    • 6.1 符号运算基础
      • 6.1.1 利用Matlab自动推导公式
    • 6.2 Matlab中的数值计算
      • 6.2.1 积分的计算
      • 6.2.2 龙格库塔:常微分方程的数值解法
      • 6.2.3 fmincon函数与非线性方程最小值
    • 6.3 统计、拟合、插值
      • 6.3.1 协方差与相关系数
    • 6.4 GUI设计初步
    • 6.5 matlab GUI界面编程
      • 6.5.1 gui实例
      • 6.5.2 gui编程中常用函数
      • 6.5.3 App Designer入门
    • 6.6 实验:GUI设计图像空间变换系统
    • 6.7 作业:利用GUI设计 计算器、信号发生器等
    • 6.8 MTALB数据导入方法
    • 6.9 课外补充:MATLAB的App会取代GUI吗?
    • 6.10 模拟退火算法matlab实现
    • 6.11 遗传算法的Matlab实现
      • 6.11.1 进化算法(Evolutionary Algorithm)及相关函数介绍
    • 6.12 粒子群算法 matlab实现
      • 6.12.1 粒子群算法及MATLAB实例仿真
    • 6.13 BP网络的应用
    • 6.14 matlab 结构体
    • 6.15 群智能算法合集
  • 7 拓展知识
    • 7.1 什么是算法的时间复杂度?
    • 7.2 Notepad++使用教程
    • 7.3 MATLAB常用函数总结
    • 7.4 MATLAB常用知识点总结
    • 7.5 MATLAB命令大全
    • 7.6 视频:MATLAB官方基础教程
    • 7.7 经典书籍:Matlab2012经典超强教程
    • 7.8 经典书籍:MATLAB揭秘(自学宝典)
    • 7.9 经典资料:MATLAB N个实用技巧
    • 7.10 Matlab编程小技巧
    • 7.11 寻优算法
      • 7.11.1 Dijkstra算法python实现
    • 7.12 PYTHON基础教程
      • 7.12.1 Python进阶
      • 7.12.2 Python小技巧
      • 7.12.3 Python总结
        • 7.12.3.1 Python循环语句总结
        • 7.12.3.2 24个顶级Python库
        • 7.12.3.3 魔法函数
      • 7.12.4 廖雪峰python
      • 7.12.5 正则表达式基础
      • 7.12.6 numpy
        • 7.12.6.1 101道Numpy习题
        • 7.12.6.2 Numpy简要语法教程
        • 7.12.6.3 Numpy实现全连接神经网络 (手写数字识别)
        • 7.12.6.4 图解NumPy
      • 7.12.7 matplotlib
        • 7.12.7.1 matplotlib练习50题
        • 7.12.7.2 Matplotlib速查表
        • 7.12.7.3 Matplotlib 实操指南
      • 7.12.8 Python3 模块 import
      • 7.12.9 Python 小项目
    • 7.13 参考资源:数据结构与算法
      • 7.13.1 十大经典排序算法总结
    • 7.14 机器学习概述
      • 7.14.1 反向传播算法
        • 7.14.1.1 反向传播的数学原理
      • 7.14.2 极大似然估计
        • 7.14.2.1 极大似然估计与最小二乘法
      • 7.14.3 Batch Normalization
        • 7.14.3.1 Batch Normalization&Dropout浅析
        • 7.14.3.2 ​BN层的梯度反向传播计算
        • 7.14.3.3 Batch Size的大小与神经网络的性能
        • 7.14.3.4 标准化和归一化
      • 7.14.4 主成分分析PCA与SVD奇异值分解
        • 7.14.4.1 岭回归 与 PCA
        • 7.14.4.2 PCA原理推导
        • 7.14.4.3 PCA原理新解
        • 7.14.4.4 svd
        • 7.14.4.5 PCA数学原理
      • 7.14.5 正则化
        • 7.14.5.1 L1、L2正则化和过拟合 总结
        • 7.14.5.2 L1 和 L2 正则化的直观解释
      • 7.14.6 SVM
        • 7.14.6.1 从零推导支持向量机(SVM)
        • 7.14.6.2 支持向量机(SVM)介绍
        • 7.14.6.3 SVM推导与实战
        • 7.14.6.4 支持向量机的直观理解
        • 7.14.6.5 浅显易懂的支持向量机SVM
      • 7.14.7 线性回归
      • 7.14.8 逻辑回归
      • 7.14.9 BP算法
        • 7.14.9.1 万能逼近——神经网络拟合任意函数原理
      • 7.14.10 激活与池化
        • 7.14.10.1 激活函数与损失函数 小结
      • 7.14.11 深度学习简述
        • 7.14.11.1 MATLAB2020深度学习实例
      • 7.14.12 损失函数与误差反向传播
        • 7.14.12.1 梯度下降与损失函数
      • 7.14.13 深度学习优化问题
      • 7.14.14 梯度下降法
        • 7.14.14.1 各类梯度下降算法的Python实现
        • 7.14.14.2 梯度下降的直观理解
        • 7.14.14.3 动量、RMSProp、Adam
      • 7.14.15 卷积的概念
        • 7.14.15.1 卷积的矩阵化算法
      • 7.14.16 局部连接
      • 7.14.17 RNN
      • 7.14.18 LSTM
      • 7.14.19 CNN-四大经典CNN技术浅析
      • 7.14.20 熵(Entropy)与交叉熵
      • 7.14.21 softmax函数详解
      • 7.14.22 自编码算法详细理解与代码实现
      • 7.14.23 pytorch
        • 7.14.23.1 ​PyTorch简介
          • 7.14.23.1.1 Pytorch快速入门资料
        • 7.14.23.2 CNN的PyTorch实现
        • 7.14.23.3 pytorch总结
        • 7.14.23.4 PyTorch trick 集锦
        • 7.14.23.5 在PyTorch上加载自定义数据集
        • 7.14.23.6 实战:Pytorch识别验证码
        • 7.14.23.7 实战:Transformer的最简洁pytorch实现
        • 7.14.23.8 使用PyTorch实现神经网络分类
      • 7.14.24 卷积神经网络CNN概述
        • 7.14.24.1 CNN 简易原理
        • 7.14.24.2 卷积神经网络CNN原理详解
        • 7.14.24.3 自己手写一个卷积神经网络
        • 7.14.24.4 CNN反向传播算法
        • 7.14.24.5 卷积计算、作用与思想
        • 7.14.24.6 用卷积神经网络CNN识别手写数字集
        • 7.14.24.7 卷积 池化 参数的计算
        • 7.14.24.8 im2col方法实现卷积算法
        • 7.14.24.9 卷积核的梯度计算
        • 7.14.24.10 卷积层反向传播推导及实现
        • 7.14.24.11 反向传输算法
          • 7.14.24.11.1 resnet残差网络
        • 7.14.24.12 CNN反向传播的MATLAB实现
      • 7.14.25 神经网络的调参技巧
      • 7.14.26 BP神经网络
        • 7.14.26.1 零开始搭建bp神经网络
        • 7.14.26.2 MATLAB自带的bp工具箱
        • 7.14.26.3 神经网络中偏置(bias)的作用
      • 7.14.27 聚类分析 k-means
        • 7.14.27.1 matlab做聚类分析(k-means)
        • 7.14.27.2 聚类模型探讨综述
        • 7.14.27.3 5种经典聚类算法
      • 7.14.28 深度学习的一些概念
      • 7.14.29 人工智能简述:AI的过去和现在
      • 7.14.30 k-NN(k近邻算法)
      • 7.14.31 神经网络中的优化器:BGD、SGD、MBGD、Momentum
      • 7.14.32 卷积神经网络的经典网络总结
        • 7.14.32.1 卷积神经网络中十大拍案叫绝的操作
      • 7.14.33 GAN 对抗样本攻击
      • 7.14.34 蒙特卡洛模拟
      • 7.14.35 dropout与随机部分连接
      • 7.14.36 Jupyter 等 IDE概览
      • 7.14.37 分类算法常用评价指标
      • 7.14.38 Inception 网络与不变性
      • 7.14.39 卷积神经网络的可视化
      • 7.14.40 隐马尔可夫模型HMM
        • 7.14.40.1 马尔科夫链
    • 7.15 MATLAB音频处理
      • 7.15.1 python处理音频信号
    • 7.16 图像处理
      • 7.16.1 图像处理中的指标
    • 7.17 代码集
    • 7.18 论文写作与阅读方法
      • 7.18.1 期刊投稿攻略
      • 7.18.2 论文排版教程
      • 7.18.3 SCI-HUB论文下载技巧
      • 7.18.4 几种论文写作神器,提高写作效率
      • 7.18.5 latex入门
      • 7.18.6 LaTeX教程
    • 7.19 机器学习常用的网站以及资源
      • 7.19.1 很详细的ML&DL学习博客
    • 7.20 SymPy 符号计算基本教程
  • 8 程序设计数学基础
    • 8.1 编程数学基础
      • 8.1.1 概率的历史
      • 8.1.2 概率
        • 8.1.2.1 常见概率分布
          • 8.1.2.1.1 二维正态分布
        • 8.1.2.2 蒙特卡罗方法
        • 8.1.2.3 置信区间
        • 8.1.2.4 协方差与相关系数
      • 8.1.3 矩阵 向量求导法则
      • 8.1.4 雅可比矩阵 海森矩阵
      • 8.1.5 矩阵的几种分解方式
      • 8.1.6 行列式和代数余子式
      • 8.1.7 向量
      • 8.1.8 矩阵的基本运算
      • 8.1.9 矩阵分析
      • 8.1.10 矩阵的LU分解
      • 8.1.11 矩阵奇异值分解(SVD)
        • 8.1.11.1 SVD分解2
        • 8.1.11.2 SVD分解逐步推导
        • 8.1.11.3 奇异值与特征值的意义
      • 8.1.12 随机向量
        • 8.1.12.1 随机过程简述
      • 8.1.13 投影矩阵和最小二乘
      • 8.1.14 知乎数学精选集
        • 8.1.14.1 高数问题集
      • 8.1.15 小波变换
      • 8.1.16 程序设计数学基础1:高等数学
      • 8.1.17 程序设计数学基础2:线性代数
      • 8.1.18 程序设计数学基础3:概率论和数理统计
      • 8.1.19 向量的距离与相似度计算
      • 8.1.20 复数
      • 8.1.21 高等数学——幂级数
      • 8.1.22 无穷小的本质
      • 8.1.23 数列极限和收敛性
      • 8.1.24 不定积分技巧总结
    • 8.2 有趣的数学题目
    • 8.3 高等数学
      • 8.3.1 泰勒级数
  • 9 路径规划与智能算法
    • 9.1 常见路径规划算法简介
    • 9.2 Dijkstra算法详细
  • 10 教学文档
    • 10.1 授课计划
    • 10.2 课程标准
matlab 结构体

               matlab之结构体数组struct


要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在MATLAB中实现struct比C中更为方便。


1、结构体数组创建

创建结构体数组有两种方式,分别为直接创建和使用struct函数


1.1 直接创建

直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充。下面创建一个Student结构体数组:


Student.name = 'wangx';

Student.sex = 'Male';

Student.height = '170';


字段可以动态添加。

以上建立了单个结构体变量,下面将其扩充为结构体数组:


Student(2).name = 'zhangsan';

Student(2).sex = 'Male';

Student(2).height = 172;


1.2 使用struct函数

struct方式方式创建结构体数组如下:


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)





1、直接创建结构体

>> stu(1).name='zhangsan';
>> stu(1).age=28;
>> stu(1).gender='male';
>> stu(2).name='lisi';
>> stu(2).age=29;
>> stu(2).gender='male';

复制代码

2、使用struct函数也可以创建结构,该函数产生或把其他形式的数据转换为结构数组。

struct的使用格式为:

s = sturct('field1',values1,'field2',values2,…);

  

结构体处理的的一些函数 :

1.删除结构体操作rmfield() 
s2=rmfield(s1,’color’)%删除s1中的一个字段color 
s2=rmfield(s1,{‘color’,‘type’})%删除s1中的2个字段color和type

2.isstruct(s2)-判断是否为结构体

3.isfield(s2,’a’)-判断’a’字段是否属于这个结构体 
  b=isfield(s,{‘type’,’color’})-同时判断两个字段是否属于结构体,返回值就是两个数。

4.fieldnames(s)-获取s结构体中的字段名字 

5.orderfields(s)-对s结构体中的字段进行排序,按首字母顺序

6.getfield()-取得结构体字段的值

7.setfield()-对结构体的字段赋予新的值

8.struct2cell(s)-将结构体s转换为单元数组

这里以以K为例来验证这些参数



========================================


struct  结构体数组

说明

结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。可以使用 structName.fieldName 格式的圆点表示法来访问字段中的数据。

创建对象

当您有数据要放入新的结构体中时,可以使用圆点表示法创建结构体,每次为结构体命名一个字段:

s.a = 1;
s.b = {'A','B','C'}
s = struct with fields:
    a: 1
    b: {'A'  'B'  'C'}

也可以按如下所述,使用 struct 函数创建一个结构体数组。您可以同时指定许多字段,也可以创建一个非标量结构体数组。

语法

s = struct

s = struct(field,value)

s = struct(field1,value1,...,fieldN,valueN)

s = struct([])

s = struct(obj)

说明

s = struct 创建不包含任何字段的标量 (1×1) 结构体。

示例

s = struct(field,value) 创建具有指定字段和值的结构体数组。value 输入参数可以是任何数据类型,例如数值、逻辑值、字符或元胞数组。

  • 如果 value 不是元胞数组,或者 value 是标量元胞数组,则 s 是标量结构体。例如,s = struct('a',[1 2 3]) 创建一个 1×1 结构体,其中 s.a = [1 2 3]

  • 如果 value 是非标量元胞数组,则 s 是维度与 value 相同的结构体数组。s 的每个元素包含 value 的对应元素。例如,s = struct('x',{'a','b'}) 返回 s(1).x = 'a' 和 s(2).x = 'b'

  • 如果 value 是空元胞数组 {},则 s 是空 (0×0) 结构体。

示例

s = struct(field1,value1,...,fieldN,valueN) 创建一个包含多个字段的结构体数组。

  • 如果 value 的所有输入都不是元胞数组,或者 value 中作为元胞数组的所有输入都是标量,则 s 是标量结构体。

  • 如果任一 value 输入是非标量元胞数组,则 s 具有与该元胞数组相同的维度。此外,如果两个或多个 value 输入是非标量元胞数组,则它们必须都具有相同的维度。

    对于类型为标量元胞数组或任何其他数据类型的数组的任何 valuestruct 将 value 的内容插入 s 的所有元素的相关字段中。例如,s = struct('x',{'a','b'},'y','c') 返回 s(1).x = 'a's(2).x = 'b's(1).y = 'c' 和 s(2).y = 'c'

  • 如果任何 value 输入是空元胞数组 {},则输出 s 是空 (0×0) 结构体。要指定一个空字段并保留其他字段的值,请改用 [] 作为 value 输入。

s = struct([]) 创建不包含任何字段的空 (0×0) 结构体。

s = struct(obj) 创建包含与 obj 的属性对应的字段名称和值的标量结构体。struct 函数不会转换 obj,而是将 s 创建为一个新的结构体。此结构体不保留类信息,因此专用、受保护和隐藏的属性在 s 中变为公共字段。struct 函数在您使用此语法时会发出警告。

输入参数

全部折叠

field - 字段名称
字符向量 | 字符串标量

字段名称,指定为字符向量或字符串标量。有效字段名称以字母开头,可以包含字母、数字和下划线。字段名称的最大长度是 namelengthmax 函数返回的值。

value - 
数组

值,指定为任何类型的数组。如果 value 有任何输入是非标量元胞数组,则所有非标量元胞数组输入必须具有相同的维度。

如果 value 有任何输入是空元胞数组 {},则输出是空结构体数组。要指定单个空字段,请使用 []

obj - 对象
标量 | 数组

对象,指定为标量或对象数组。struct 函数将 obj 的属性复制到新标量结构体的字段中。

struct 函数不能基于大多数基本数据类型创建结构体。例如,如果 obj 具有 double 或 char 数据类型,则 struct 会发出错误消息。但是,struct 会将表或时间表的属性以结构体形式返回。请参阅 MATLAB 基础类获得基本数据类型的列表。

示例

全部折叠

在结构体中存储相关数据变量


在结构体的字段中存储相关数据片段。您可以为这些字段提供对数据进行描述的易读名称。

通过使用圆点表示法添加字段来创建一个结构体。这些字段包含正弦波的 x 值和 y 值以及描述数据的文本。

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)'

绘制正弦波。您可以按字段名称引用 x 和 y 值的数组。然后添加标题。

plot(data.x,data.y)
title(data.title)

具有一个字段的结构体


创建包含一个字段的非标量结构体。

field = 'f';
value = {'some text';
         [10, 20, 30];
         magic(5)};
s = struct(field,value)
s=3×1 struct
    f

查看每个元素的内容。

s.f
ans = 
'some text'
ans = 1×3

    10    20    30
ans = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

访问非标量结构体的字段(例如 s.f)时,MATLAB® 返回一个逗号分隔的列表。在本示例中,s.f 等效于 s(1).f, s(2).f, s(3).f


具有多个字段的结构体


创建包含多个字段的非标量结构体。

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=2×4 struct
    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'

带有空字段的结构体


创建包含一个空字段的结构体。使用 [] 指定空字段的值。

s = struct('f1','a','f2',[])
s = struct with fields:
    f1: 'a'
    f2: []

包含元胞数组的字段


创建具有一个字段的一个结构体,该字段包含一个元胞数组。

field = 'mycell';
value = {{'a','b','c'}};
s = struct(field,value)
s = struct with fields:
    mycell: {'a'  'b'  'c'}

空结构体


创建包含多个字段的空结构体。

s = struct('a',{},'b',{},'c',{})
s = 

  0x0 empty struct array with fields:

    a
    b
    c

为空结构体中的字段赋值。

s(1).a = 'a'
s = struct with fields:
    a: 'a'
    b: []
    c: []

嵌套结构体


创建一个嵌套结构体,其中 a 是具有一个字段的结构体,该字段又包含另一个结构体。

a.b = struct('c',{},'d',{})
a = struct with fields:
    b: [0x0 struct]

查看 a.b 的字段的名称。

fieldnames(a.b)
ans = 2x1 cell array
    {'c'}
    {'d'}







========================================================

avgscore.m

function   avg = avgscore(testscores, student, first, last)

testscores.Ann_Lane.week(1:25) = ...

  [95 89 76 82 79 92 94 92 89 81 75 93 ...

   85 84 83 86 85 90 82 82 84 79 96 88 98];


testscores.William_King.week(1:25) = ...

  [87 80 91 84 99 87 93 87 97 87 82 89 ...

   86 82 90 98 75 79 92 84 90 93 84 78 81];

for k = first : last

    scores(k) = testscores.(student).week(k);

end

avg = sum(scores)/(last - first + 1);

end



%% 结构体

S = struct('name', 'Ed Plum','score', 83, 'grade','B+')

S(2).name = 'Toni Miller';

S(2).score = 91;

S(2).grade = 'A-';

S(3) = struct('name','Jerry Garcia',... 

               'score',70,'grade','C')

%S.name

%S.score

%S(1).score, S(2).score, S(3).score

%S.grade


scores = [S.score]

avg_score = sum(scores) / length(scores)


% 创建字符数组

names = char(S.name)

% 创建元胞数组

names = {S.name}

% 将结构体数组的每个元素的字段赋值给结构体外部的单独变量

[N1 N2 N3] = S.name


%% 动态字段名称

% 访问结构体中的数据的最常用方法是指定要引用的字段的名称

% 访问结构体数据的另一种方法是使用动态字段名称

% 此处显示的点-括号语法将 expression 作为动态字段名称

% structName.(expression)

% structName.(expression)(7,1:25)


testscores.Ann_Lane.week(1:25) = ...

  [95 89 76 82 79 92 94 92 89 81 75 93 ...

   85 84 83 86 85 90 82 82 84 79 96 88 98];


testscores.William_King.week(1:25) = ...

  [87 80 91 84 99 87 93 87 97 87 82 89 ...

   86 82 90 98 75 79 92 84 90 93 84 78 81];


avgscore(testscores, 'Ann_Lane', 7, 22)

avgscore(testscores, 'William_King', 7, 22)




=============================================






==============================


代码实例:


data= struct ;                           % s = struct 创建不包含任何字段的标量 (1×1) 结构体。

data.x = linspace(0,2*pi);

data.y = sin(data.x);

data.title = 'y = sin(x)';

data


plot(data.x,data.y)

title(data.title)



%%%%%%%%%%%%%

field = 'f';

value = {'some text';

         [10, 20, 30];

         magic(5)};

s = struct(field,value)

 s(2).f

 s(3).f

 


%%%%%%%%%%%%%%%%%%

%%% struct建立方法1


s = struct;

s.f1=zeros(1,10);

s.f2=rand(2,6);

s.f3=3;

s.f4=magic(3);

s


s(1).f1

s(1).f2

s(1).f3

s(1).f4



%%%%%%%%%%%%%%%%%%

%%% struct建立方法2


field1 = 'f1';  value1 = zeros(1,10);

field2 = 'f2';  value2 = rand(2,6);

field3 = 'f3';  value3 = 3;

field4 = 'f4';  value4 = magic(3);

s = struct(field1,value1,field2,value2,field3,value3,field4,value4)

s(1).f1

s(1).f2

s(1).f3

s(1).f4


s(2).f4    %错误 : 索引超出数组范围。



%%%%%%%%%%%%%%%%%%


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(1).f1 

 s(2).f1

 

 s(1).f2 

 s(2).f2

 

 s(1).f3 

 s(2).f3

 

 s(1).f4 

 s(2).f4


 s(1)

 s(2)

 


 %%  嵌套结构体

A = struct;

A.a = struct('c',{'cat','dog'},'d',{'bird','tree'});

A.b = struct('e',{'face','leg'},'f',{12,25});


A


A.a.c

A.a(1).c

A.a(1).c(3)


A.b.f

A.b(2).f







 %%   元胞数组与结构体数组

% 此示例比较元胞和结构体数组,并说明如何在每种类型的数组中存储数据。

% 使用元胞和结构体数组都可以存储不同类型和大小的数据。

% 结构体数组: 结构体数组中数据包含在可按名称访问的字段中。

% 例如,将患者记录存储在一个结构体数组中。


patient(1).name = 'John Doe';

patient(1).billing = 127.00;

patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];


patient(2).name = 'Ann Lane';

patient(2).billing = 28.50;

patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];


patient


% 为每位患者的测试结果创建一个条形图。

numPatients = numel(patient);  %n=numel(A)该语句返回数组中元素的总数。  

for p = 1:numPatients

   figure

   bar(patient(p).test)

   title(patient(p).name)

   xlabel('Test')

   ylabel('Result')

end





%%   元胞数组

% 元胞数组

% 元胞数组中数据包含在可按数值索引访问的元胞中。

% 元胞数组的常见应用包括存储单独的文本段,以及存储电子表格中的异类数据。

% 例如,在一个元胞数组中存储一段时间中三个城市的温度数据。


temperature(1,:) = {'2009-12-31', [45, 49, 0]};

temperature(2,:) = {'2010-04-03', [54, 68, 21]};

temperature(3,:) = {'2010-06-20', [72, 85, 53]};

temperature(4,:) = {'2010-09-15', [63, 81, 56]};

temperature(5,:) = {'2010-12-09', [38, 54, 18]};


temperature


% 按日期绘制每个城市的温度。

allTemps = cell2mat(temperature(:,2));

dates = datetime(temperature(:,1));


plot(dates,allTemps)

title('Temperature Trends for Different Locations')

xlabel('Date')

ylabel('Degrees (Fahrenheit)')