通信系统仿真

崔春雷

目录

  • 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基本数据类型




1、Matlab 中的常量


2、Matlab 中的变量


变量的赋值:

MATLAB不需要任何类型声明或维度语句。当MATLAB遇到新的变量名称时,它将创建变量并分配适当的内存空间。在MATLAB环境中,每个变量都是数组或矩阵。

如果变量已经存在,则MATLAB将使用新内容替换原始内容,并在必要时分配新的存储空间。

例如,

total = 136;

上述语句创建一个名为total1x1矩阵,并将值136存储在其中。

变量的多重分配赋值

可以在同一行上拥有多个赋值。 例如,

a = 2; b = 7; c = a * b

MATLAB执行上述语句并返回以下结果 

c = 14


3、Matlab 中的常用数据类型



下表显示了MATLAB中最常用的数据类型 :                                                            

数据类型描述
int88位符号整数
uint88位符号整数
int1616位有符号整数
uint1616位无符号整数
int3232位有符号整数
uint3232位无符号整数
int6464位有符号整数
uint6464位无符号整数
single单精度数值数据
double双精度数值数据(也是matlab的默认数值类数据类型)
logical逻辑值为1或0,分别代表true和false
char字符数据(字符串作为字符向量存储)
单元格阵列索引单元阵列,每个都能够存储不同维数和数据类型的数组
结构体C型结构,每个结构具有能够存储不同维数和数据类型的数组的命名字段
函数处理指向一个函数的指针
用户类用户定义的类构造的对象
Java类从Java类构造的对象


matlab数据类型 —— 整型

  • 有符号型中的符号位:0 位为正,1 位为负


三、整型创建

由于 Matlab 中数值的默认存储类型是 双精度浮点型,因此必须通过上表中的函数将其转换成指定类型的整型。

如果不理解,可以把x=数据类型(数值)当作对其赋值给了相应数据类型的值。举个例子,x=32 和 x=double(32)是相同的,就当 matlab 默认将x变成了 double 类型的值。





例1:创建整形、双精度、字符型等数据

使用以下代码创建脚本文件(datatype1.m


str  = 'Hello World!'
n   = 2345
d   = double(n)
un   =  uint32(789.50)
rn   = 5678.92347
c   = int32(rn)


当上述代码被编译和执行时,它产生以下结果 -


str =
   'Hello World!'

n =
   2345

d =
   2345

un =
    uint32
   790

rn =
   5.6789e+03

c =
    int32
    5679


例2:创建复数

复数由两个单独的部分组成:实部和虚部。基本虚数单位等于 -1的平方根。这在 MATLAB中通过以下两个字母之一表示:i或 j。以下语句显示了一种在 MATLAB 中创建复数值的方法。变量 x被赋予了一个复数值,该复数的实部为 2,虚部为 3

x = 2 + 3i;


创建复数的另一种方法是使用 complex函数。此函数将两个数值输入组合成一个复数输出,并使第一个输入成为实部,使第二个输入成为虚部:

x = rand(3) * 5;
y = rand(3) *(-8);

z = complex(x, y)
z =
  4.7842 -1.0921i   0.8648 -1.5931i   1.2616 -2.2753i
  2.6130 -0.0941i   4.8987 -2.3898i   4.3787 -3.7538i
  4.4007 -7.1512i   1.3572 -5.2915i   3.6865 -0.5182i

您可以使用 real和 imag函数分解复数,捕获其实部和虚部:

zr = real(z)
zr =
   4.7842    0.8648    1.2616
   2.6130    4.8987    4.3787
   4.4007    1.3572    3.6865

zi = imag(z)
zi =
  -1.0921   -1.5931   -2.2753
  -0.0941   -2.3898   -3.7538
  -7.1512   -5.2915   -0.5182
 
 
  可以使用
abs函数来得到复数的绝对值(辐值)
  z=3+4i;
  z_v=abs(z)
 

复数相关函数

函数作用
abs绝对值和复数幅值
angle相位角
complex创建复数数组
conj复共轭
cplxpair将复数排序为复共轭对组
i , j虚数单位
imag复数的虚部
isreal确定数组是否为实数数组
real复数的实部
signSign 函数(符号函数)
unwrap更正相位角以生成更平滑的相位图



3.1  Matlab 的基本数据类型——数值类型


(1)数字显示格式命令

默认情况下,MATLAB显示四位小数位数。这称为:短格式

但是,如果要更精确,则需要使用format命令。

format short

5位定点表示(默认)

format long

15位定点表示

format short e

5位浮点表示(科学计数法)

format long e

15位浮点表示(科学计数法)

format short g

5位定点和5位浮点中自动选择最好格式表示

format long g

15位定点和15位浮点中自动选择最好格式表示

format hex

16进制格式表示

format +

在矩阵中,用符号+、-和空格表示正号、负号和零


format long 命令将数字舍入到小数点后15位
>> format long
x = 7 + 10/3 + 5 ^ 1.2

x =
  17
.231981640639408

另一个示例如下 :

>> format short
x = 7 + 10/3 + 5 ^ 1.2

x =
   17.
2320


format bank 命令将数字舍入到小数点后两位。

>> format bank
daily_wage  = 177.45;
weekly_wage = daily_wage * 6
weekly_wage = 1064.70

format short e命令以指数形式显示四位小数加上指数。

>> format short e
4.678 * 4.9

ans =
   
2.2922e+01


format long e命令允许以指数形式显示十六位小数加上指数。 

>> format long e
x = pi

x =
     3.141592653589793e+00

format rat命令给出计算结果最接近的合理表达式。 

>> format rat
4.678 * 4.9

ans =
    2063/90


(2)MATLAB中的常用运算符                                                                                                

运算符使用说明
+相加; 加法运算符。
-相减; 减法运算符。
*标量和矩阵乘法运算符。
.*阵列乘法运算符。
^标量和矩阵求幂运算符。
.^阵列求幂运算符。
\左除法运算符。
/右除法运算符。
.\阵列左除法运算符。
./右除法运算符。
:冒号; 
生成规则间隔的元素,并表示整个行或列。
( )括号; 
(1)和函数一起使用,用于函数后面,用于包含函数的参数
(2)用于数组元素的索引; 
(3)覆盖优先级。
[ ]括号; 
罩住阵列元素,创建数组和矩阵时候使用。
.小数点。
省略号; 行连续运算符
,逗号; 
分隔一行中的语句和元素
;分号; 
(1)用于矩阵内元素的换行;
(2)用于屏幕的抑制输出显示。
%百分号;指定一个注释并指定格式。
_引用符号和转置运算符。
._非共轭转置运算符。
=赋值运算符。



运算的优先级规则:

(1)同等优先级下从左向右运算.

(2)优先级顺序(从高到低)

括号 ( )

乘方 ^

乘除法 * , /

加减法 + , -

程序一 :


例:长任务可以通过使用省略号( ... )扩展到另一行

initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity
...
+ acceleration * time



(3)MATLAB中的常用数学函数

                 这些函数的对象可以是:数、数组、矩阵                                      

 

函数分类

 

 

函数名

 

 

说明

 

 

指数函数

 

 

exp

 

 

e为底数

 

 

 对数函数

 

 

log

 

 

自然对数,即以e为底的对数

 

 

log10

 

 

常数对数,即以10为底的对数

 

 

log2

 

 

2为底的对数

 
 

绝对值函数

 
 

abs

 
 

表示实数的绝对值及复数的模

 
 

 三角函数(自变量的单位为弧度)

 
 

sin

 
 

正弦函数

 
 

cos

 
 

余弦函数

 
 

tan

 
 

正切函数

 
 

cot

 
 

余切函数

 
 

sec

 
 

正割函数

 
 

csc

 
 

余割函数

 
 

......

 
 

......

 
 

......

 
 

最大/最小函数

 
 

max

 
 

求最大数

 
 

min

 
 

求最小数

 



附表:MATLAB内置的三角运算函数大全

正弦: sin,sind,sinpi,asin,asind,sinh,asinh

余弦: cos,cosd,cospi,acos,acosd,cosh,acosh

正切: tan,tand,atan,atand,atan2,atan2d,tanh,atanh

余割: csc,cscd,acsc,acscd,csch,acsch

正割: sec,secd,asec,asecd,sech,asech

余切: cot,cotd,acot,acotd,coth,acoth

斜边: hypot

转换: deg2rad,rad2deg,cart2pol,cart2sph,pol2cart,sph2cart

MATLAB内置的指数对数函数:

 exp,expm1,log,log10,log1p,log2,nextpow2,nthroot,pow2,reallog,realpow,realsqrt,sqrt

MATLAB内置的复函数: abs,angle,complex,conj,cplxpair,i,imag,isreal,j,real,sign,unwrap



例:

:   2.5^(-1.2) 

       :    3^0.5  或  sqrt(3) 

            :    exp(2)

  :  log( exp(1)^0.5+3/sqrt(2) )






作业:上机编程计算下面表达式的值。






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


MATLAB常用命令:

clear          清空内存

clear all     清空全部内存

clc             清空屏幕   

help max   查看max函数的基本用法(当然,你可以把max换成其他你想查看的函数)

doc max    查看max函数的详细使用文档(当然,你可以把max换成其他你想查看的函数)

whos         查看内存中所有变量的详细情况

whos x,y    查看指定的变量x,y的详情(当然你可以改为其他你想查看的变量名)

class  x       查看变量x的属性,也就是属于哪种变量类型。


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



拓展知识1:

                                编译器与自举

1个很有意思的问题:

C语言的编译器,是用C语言写的!

什么?C语言是用C语言写的,这不就是“鸡生蛋,蛋生鸡”的问题吗?

要让C语言编译通过,就需要一个C语言编译器。但是C语言编译器是用C写的。那么世界上第一个能执行的编译器,是如何编译的呢?





这种编译器也用语言本身写的特性,称之为“自举”。

奇怪的是,这么一个让我们纳闷的问题,却很少有人提到。似乎大神们觉得很自然,不屑于说明。

直到后来学到一些编译相关的技术,才慢慢了解到这件事的原委。原因不复杂,我简化一下表述:

  1. 首先,简化C语言的设计,只选择最最基本、不得不实现的功能,形成一个C语言的子集。我们可以叫它C0。

  2. 用汇编语言实现C0语言的编译器,由于C0功能很少,比较容易直接写一个编译器。

  3. 用C0语言去实现更多必要的功能,由于C0语言功能太弱,遇到不好写的地方可以用汇编来打补丁。最终你得到了一个改进版的C0语言,我们称之为C1。

  4. 用C1语言去继续实现更多C语言功能,不好写的地方继续用汇编打补丁。可以得到C2语言

  5. 用C2语言去继续实现更多C语言功能,不好写的地方继续用汇编打补丁。可以得到C3语言

  6. 以此类推……

  7. 到Cn语言的时候,你已经得到了一个足够接近C语言的编译器。

  8. 继续迭代一两次……

  9. 终于,你得到了一份C语言的编译器。而前面的从C0版到Cn-1 版的编译器,都可以扔掉了。

为什么要分N个步骤呢?主要还是为了解释C语言慢慢进化的历史过程。实际上不见得要分很多步,很多中间步骤只是代表了远古大神们迭代改进的过程。

如果大神足够神,可以更简化:

  1. 直接用汇编语言写一个C语言编译器。

  2. 然后再用C语言写一个C语言编译器的源码,用汇编版的编译器 编译这个C代码

  3. 即可得到一个可运行、可正常使用的编译器。

然后,那个用汇编语言写的版本就可以扔掉了。

理解这个问题的关键,是认识到:编译器,只是读取文本文件(源代码),输出某种计算机编码(比如机器语言)的程序。

既然编译器也只是个普通的程序,那么就能用任何语言编写。

所以,理论上来讲,你可以用Python、Java或者Scratch来写个C语言编译器

理论上,编译器只是把文本文件编译成二进制代码,因此,任何语言都可以用来写编译器,比如c语言是1972年诞生的,basic语言比他早,用basic语言写个c语言的编译器也不是不可以。当然,实际情况是c语言的第一个版本是用b语言加汇编写成的,b语言本身是汇编语言写成的,汇编语言是机器语言。现在写编译器大多用c++写。



拓展知识2:浮点数与定点数

首先,计算机的小数并不都叫浮点数。

只是现代桌面处理器大都集成有 FPU (浮点处理器),我们在写程序时,用到小数的地方,用 float 类型表示,可以方便快速地对小数进行运算。


计算机中小数的表示法,其实有定点和浮点两种。

定点表示法因其难以避免的局限性 (表示范围和精度是一对矛盾体),已经被当代桌面处理器(如x86)摒弃不用。但我想只要你愿意,依然可以在你台式机的编译器中用定点开心的玩着小数。

但是,并不是所有的处理器都像 X86 这么豪,在某些恶劣、简陋的嵌入式环境中,哪有 FPU 给你用,小数还是不得不用定点的方式,例如某些 DSP。因为定点运算相对浮点较为简单。

科普到底,以 32 bit 机器为例,说下什么是定点数和浮点数。

定点数


定点的意思是,小数点固定在 32 位中的某个位置,前面的是整数,后面的是小数。

小数点具体固定在哪里,可以自己在程序中指定。

例如上面的例子,小数点在 23 bit 处。

无论你是124.25,是0.5, 还是100, 小数点都在 23 bit 的位置固定不变。


浮点数


浮点数的存储格式,一般按照标准 IEEE 754。

IEEE 754 规定,浮点数的表示方法为:

最高的 1 位是符号位 s,接着的 8 位是指数E,剩下的 23 位为有效数字 M。

例如:

5 DEC = 101 BIN   = 1.01 x 2^2

9 DEC = 1001 BIN = 1.001 x 2^3

100 DEC = ‭01100100‬ BIN = 1.100100 x 2^6

0.125 DEC = 0.001 BIN = 1 x 2^-3

这一下,小数点的位置就是迷之存在,漂浮不定了。

浮点,想必故此得名吧。





  • 浮点数的底层表示

  • 浮点数的精度损失问题

  • 浮点数的表示范围和精度

小数的二进制表示

浮点数的表示借鉴了科学计数法,比如在十进制中 [公式] 可以表示成 [公式] 。类似地,浮点型数据的二进制存储结构也可以被划分成:符号位 + 指数位 + 尾数位。按照国际标准IEEE 754,任意一个二进制浮点数可以表示成: [公式] 其中:

  • [公式] 表示符号位, [公式] 表示正数, [公式] 表示负数

  • [公式] 表示有效数字, [公式]

  • [公式] 表示指数位

指数部分决定了数的大小范围,有效数字部分决定了数的精度。

举两个简单的例子:

十进制二进制二进制科学计数法SEM
3.011.01.1 x 2^1011.1
-5.0-101.0-1.01 x 2^2121.01

浮点数在计算机底层的存储机制

double类型和float类型(可能还有long double类型)在计算机的底层存储结构都是一致的,唯一的不同在于float是32位而double是64位的。

无论什么数据,在计算机内存中都是以01存储的,浮点数也不例外。

0. 定点数

计算机中小数的表示按照小数点的位置是否固定可以分为浮点数和定点数。为了方便和float32浮点数做对比,我们构造一个32位精度的定点数,其中小数点固定在23bit处:



从定点数的存储上看,它表示的数值范围有限(以小数点在23bit为例,整数部分仅有8位,则整数部分取值范围是0~255),但好在处理定点数计算的硬件比较简单。

1. IEEE 754x浮点数

以32位浮点数为例,最高一位是符号位s,接着的8位是指数位E,最后的23位是有效数字M。double64最高一位是符号位,有11个指数位和52个有效数字位。下图展示了float32类型的底层表示:



其中IEEE 754的规定为:

  • 因为M的取值一定是1<=M<2,因此规定M在存储时舍弃第一个1,只存储小数点之后的数字,这样可以节省存储空间(以float32为例,可以保存23位小数信息)

  • 指数E是一个无符号整数,因此它的取值范围为0255,但是指数可以是负的,所以规定在存入E时在它原本的值加上127(使用时减去中间数127),这样E的取值范围为-127128

    • E不全为0,不全为1:正常的计算规则,E的真实值就是E的字面值减去127(中间值),M加回1

    • E全为0:指数E等于1-127为真实值,M不加回1(此时M为0.xxxxxx),这样是为了表示0和一些很小的数

    • E全为1:M全为0表示正负无穷大(取决于S符号位);M不全为0时表示不是一个数(NaN)



2. 具体例子

以78.375为例,它的整数和小数部分可以表示为: [公式] 因此二进制的科学计数法为:

[公式]

一般而言转换过程包括如下几步:

  • 改写整数部分:将整数部分的十进制改写成二进制

  • 改写小数部分:拆成 [公式] 到 [公式] 的和

  • 规格化:保证小数点前只有一位是1,改写成二进制的科学计数法表示

  • 填充:指数部分加上127(中间数)填充E;有效数字部分去掉1后填充M

按照前面IEEE 754的要求,它的底层存储为:



3. 精度损失

十进制中的0.5(代表分数1/2)表示二进制中的0.1(等同于分数1/2),我们可以把十进制中的小数部分乘以2作为二进制的一位,然后继续取小数部分乘以2作为下一位,直到不存在小数为止。

以0.2这个无法精确表示成二进制的浮点数为例:

[公式] 因此十进制下的0.2无法被精确表示成二进制小数,这也是为什么十进制小数转换成二进制小数时会出现精度损失的情况。

浮点型表示精度和范围

  • 单精度浮点数float占四个字节,表示范围-3.40E+38 ~ +3.40E+38

  • 双精度浮点数double占八个字节,表示范围-1.7E+308 ~ +1.79E+308

以float为例,能表示的最大二进制数据为 [公式] (小数点后为23个1),而二进制下 [公式] ,因此能表示的最大十进制数据是: [公式]

从二进制小数的科学计数法表示上看,可以知道float的精度为 [公式] ,double的精度为 [公式] 。

Reference

[1] q.115.com/182920/T12681

[2] blog.csdn.net/u01447036

[3] cnblogs.com/wangsiting1

[4] blog.csdn.net/u01447036

[5] cnblogs.com/yiyide266/p



拓展知识3:matlab中的eps函数详解

使用matlab在写代码过程中遇到了除数为0的情况,在分母位置加了eps就没有报错了!

首先matlab中eps是一个函数,可以返回某一个数N的最小浮点数精度,形式例如eps(N)。eps(a)是|a|与大于|a|的最小的浮点数之间的距离,距离越小表示精度越高。

默认a=1,即eps = eps(1); 我们在matlab中敲入eps和eps(1)可以发现结果是一样的。eps = eps(1) = 2.2204e-16。

eps为系统运算时计算机允许取到的最小值。例如对于函数y=cosx/x。由于在编程时分母可能出现为0,所以编程时要写成:y=cosx/(x+eps)。

下来解释下eps:

我们知道浮点数其实是离散的,有限的,而且间隔是不均匀的。我们可以说一个数旁边的数是什么,而它们之间的距离就反应了其精度。越靠近0,数和数之间就越密集,精度就越高。


我画了一个简图,黑色实心点代表的是数轴的数,例如1,红圈与1的距离代表的就是eps(1),那么在1+eps(1)/2到1之间的所有数,都被认作1,MATLAB无法识别介于1和1+eps(1)/2之间的数。

 例一,eps(1)

                

可以发现eps=eps(1)=2.2204e-16,由于matlab无法区分1到1+eps(1)/2之间的数,所以就将中间的这些数四舍五入到1或者1+eps(1),比如上图中,1+0.3eps(1)就被舍入到1,然后大于0.5时,1+0.7eps(1)就被近似为1+eps(1)。

 例二,eps(0)

 

我们可以看到eps(0)比eps(1)小很多,别的精度和1一样,在0到eps(0)*0.5之间的所有数都是0,eps(0)*0.5以上到eps(0)之间的所有数都被近似为eps(0)。

 例三,eps(2)以及eps(N)


我们可以发现最小精度eps(N)随着数量级增大,eps也在逐渐增大,这在计算的过程中,都要注意。防止大数吃小数。



浮点数的比较方法

float 为什么不能用== ,>=,<=?

最好不要将浮点变量用“==”或“!=”做直接比较,而应该设法转化成能用“>=”或“<=”作比较的形式。计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下,这个值肯定是越小越精确,不过也看具体的个情况,够用就好。

  1. float与“零值”比较 一般情况我们会定义一个很小的接近于0的值比如0.00001或者更小的,然后浮点数跟这个数作比较。

假设x是一个浮点数: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 或者 if( abs(a-b) < FLT_EPSILON)

  1. float与float比较

假设a,b是两个浮点数是否相等: const float EPSINON = 0.00001; if( abs(a-b) <= EPSINON )

还有一种方法就是扩大再取整,比如4.113、4.114,直接比较有可能为 false,但是都扩大一千倍,然后强制转换为 int 类型,再用 == 比较就可以了。

因为如果a与b差不多时,得出的是大于呢?还是小于?

所以只能用abs(a-b)<=0.0000001,来判断a是否等于b,