通信系统仿真

崔春雷

目录

  • 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. 数学运算中的模除法和舍入

    mod除后的余数(取模运算)
    rem除后的余数
    idivide带有舍入选项的整除
    ceil朝正无穷大四舍五入
    fix朝零四舍五入
    floor朝负无穷大四舍五入
    round四舍五入为最近的小数或整数


(1) ceil( )与floor( ) 

ceil( ):    朝正无穷舍入到最近的整数(天花板方向)

floor( ):   朝无穷舍入到最近的整数(地板方向)

Y = ceil(X)将 X的每个元素四舍五入到大于或等于该元素的最接近整数。

Y = ceil(t)将 duration数组 t的每个元素四舍五入到大于或等于此元素的最接近的秒数。

Y = floor(X) 将 X 的每个元素四舍五入到小于或等于该元素的最接近整数。

Y = floor(t) 将 duration 数组 t 的每个元素四舍五入到小于或等于此元素的最接近的秒数。



>> X = [-1.9 -2.3 -0.47 -0.7; 5.6 4.2 0.35 0.8]
X =
  -1.9000   -2.3000   -0.4700   -0.7000
   5.6000    4.2000    0.3500    0.8000
   
>> Y1 = ceil(X)
Y1 =
   -1    -2     0     0
    6     5     1     1
   
>>  Y2= floor(X)
Y2 =
   -2    -3    -1    -1
    5     4     0     0



(2) fix 朝零四舍五入到最近的整数(只保留整数部分

语法: Y = fix(X)    

!→|0|←!   向零方向舍入.

Y = fix(X)X的每个元素朝零方向四舍五入为最近的整数。此操作实际上是通过删除 X中每个数的小数部分,将它们截断为整数:对于正数,fix的行为与 floor相同。对于负数,fix 的行为与 ceil相同。


将矩阵元素向零取整

X = [-1.9 -3.4; 1.6 2.5; -4.5 4.5]
X =
   -1.9000   -3.4000
    1.6000    2.5000
   -4.5000    4.5000
Y = fix(X)
Y = 
    -1    -3
     1     2
    -4     4

(3) 舎入函数 round(a)(四舍五入)

round:四舍五入为最近的小数或整数

Y = round(X)将 X的每个元素四舍五入为最近的整数。在对等情况下,即有元素的小数部分恰为 0.5时,round函数会偏离零四舍五入到具有更大幅值的整数。Y = round(X,N) 四舍五入到 N位数:N > 0:舍入到小数点右侧的第 N位数。

N = 0:四舍五入到最接近的整数。

N < 0:舍入到小数点左侧的第 N位数。


例:

x=[ 1.3   4.8  0.7  0.1;
    -1.3 -4.8 -0.7 -0.1]
y1=ceil(x)
y2=floor(x)
y3=round(x)
y4=fix(x)


4)模除求余数函数: mod(x,y) , rem(x,y)



取模运算:mod

语法:b = mod(a,m)

b = mod(a,m) 返回 a 除以 m 后的余数,其中 a 是被除数,m 是除数。此函数通常称为取模运算,表达式为 b = a - m.*floor(a./m)。mod 函数遵从 mod(a,0) 返回 a 的约定。

b = mod(23,5)

b = 3


除后的余数:rem

语法:r = rem(a,b)

r = rem(a,b) 返回 a 除以 b 后的余数,其中 a 是被除数,b 是除数。此函数通常称为求余运算,表达式为 r = a - b.*fix(a./b)。rem 函数遵从 rem(a,0) 是 NaN 的约定。


例1:计算 23 除以 5 后的余数。

a = 23;

b = 5;

r = rem(a,b)

r = 3


例2: 计算一个含正负值的整数集被除后的余数。请注意,非零结果的符号与被除数相同。


>>  a = [-4.5  -1   7  9.3];
b = 3;
r = rem(a,b)
r =
      -1.5000   -1.0000   1.0000   0.3000


其实取模和取余在目标上是一致的,但是因为语言对取余和取模上定义的不同,导致得到的结果不同。

对取余和取模定义不同的语言中,两者的不同点只有一个

取余运算在计算商值向0方向舍弃小数位
      取模运算在计算商值向负无穷方向舍弃小数位

同时,也可以这样理解:

  • 取余,遵循尽可能让商大的原则

  • 取模,遵循尽可能让商小的原则

从上面的区别可以总结出,取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意异号的情况。

下面来看一些例子:

取模

       5 mod 3 = 2
      -5 mod 3 =   1
       5 mod -3 = -1

     
-5 mod -3 = -2


取余

      5 rem 3 = 2     

    -5 rem 3 = -2
      5 rem -3 = 2

   
 -5 rem -3 = -2


%rem与mod对比

>> a = [-4  -1  7  9];

>> b = 3;

>> r = rem(a,b)

r =

      -1    -1     1     0

>> m=mod(a,b)

m =

       2     2     1     0


%rem与mod对比——用负除数除后的余数

>> a = [-4 -1 7 9];

>>b = -3;

>>r = rem(a,b)

>>m=mod(a,b)


r =

    -1    -1     1     0

m =

    -1    -1    -2     0


练习:找出数组X=1:100 中所有不能被3或5或7整除的整数的个数。

x=1:100

y1= mod(x,3)==0

y2= mod(x,5)==0

y3= mod(x,7)==0

y=~(y1|y2|y3)

n=sum(y)


5)绝对值函数abs(a)

x = [0 -1 -2 4 -4 9]
abs_x = abs(x)
x =
     0    -1    -2     4    -4     9    
abs_x =
     0     1     2     4     4     9


6)数组指数exp(a) 将矩阵元素作为e的幂exp(a)=e.^a

a = [1  -3  3 ; 2  -1  6]
result_a = exp(a)
a =
     1    -3     3
     2    -1     6
result_a =
    2.7183    0.0498   20.0855
    7.3891    0.3679  403.4288

7)平方根函数的使用 sqrt(a)

a=[2 5 8 9]
result_sqrt = sqrt(a)
a =
     2     5     8     9
result_sqrt =
    1.4142    2.2361    2.8284    3.0000

8)对数函数 自然对数 log(a), log2(a), log10(a)

a = [12 3 7;-1 4 -2; 21 17 -5]
result_log     = log(a)
result_log2   = log2(a)
result_log10 = log10(a)
a =
    12     3     7
    -1     4    -2
    21    17    -5

result_log =
   2.4849             1.0986             1.9459          
    0 + 3.1416i     1.3863             0.6931 + 3.1416i
   3.0445             2.8332             1.6094 + 3.1416i

result_log2 =
   3.5850             1.5850             2.8074          
   0 + 4.5324i      2.0000             1.0000 + 4.5324i
   4.3923             4.0875             2.3219 + 4.5324i

result_log10 =
   1.0792             0.4771             0.8451          
    0 + 1.3644i     0.6021             0.3010 + 1.3644i
   1.3222             1.2304             0.6990 + 1.3644i


9)数制之间的转换
a=bin2dec('1011001')      %将二进制数转换成十进制数
b=dec2bin(18)                %将十进制数转换成二进制数
c=hex2dec('9A2B')          %将十六进制数转换成十进制数
d=dec2hex(97)                %将十进制数转换成十六进制数
e=base2dec('212',3)        %将任意进制数转换成十进制数


输出:
a =
   89
b =
   '10010'
c =
    39467
d =
   '61'
e =
    23

10)相位角函数angle(a) 以弧度表示.

a=[3+4i,5+5i;5+12i 3]
angle_a=angle(a)*(180/pi)    %将弧度转换为度数.
a =
   3.0000 + 4.0000i   5.0000 + 5.0000i
   5.0000 +12.0000i   3.0000          
   
angle_a =
   53.1301            45.0000
   67.3801            0

11)求复数的实部和虚部real(a),imag(a)

a=[7-8i  10+i ; 3  7+2i ; 12-6i  3]
realOFa = real(a)
imagOFa = imag(a)
realANDimag = real(a) + imag(a)*i
a =
   7.0000 - 8.0000i    10.0000 + 1.0000i
   3.0000                     7.0000 + 2.0000i
  12.0000 - 6.0000i     3.0000          

realOFa =
     7    10
     3     7
    12     3

imagOFa =
    -8     1
     0     2
    -6     0

realANDimag =
   7.0000 - 8.0000i  10.0000 + 1.0000i
   3.0000                   7.0000 + 2.0000i
  12.0000 - 6.0000i   3.0000

12)求复数共轭conj(a)

a=[7-8i 10+i;3 7+2i;12-6i 3]
conjOFa = conj(a)
realANDimag = real(a) - imag(a)*j
a =
   7.0000 - 8.0000i  10.0000 + 1.0000i
   3.0000                 7.0000 + 2.0000i
  12.0000 - 6.0000i   3.0000          

conjOFa =
   7.0000 + 8.0000i  10.0000 - 1.0000i
   3.0000                    7.0000 - 2.0000i
  12.0000 + 6.0000i   3.0000          

realANDimag =
   7.0000 + 8.0000i  10.0000 - 1.0000i
   3.0000                    7.0000 - 2.0000i
  12.0000 + 6.0000i   3.0000


13).累加与累乘


>> x=1:10

x =

     1     2     3     4      5      6      7      8     9    10

>> y1=cumsum(x)

y1 =

     1     3     6    10    15    21    28    36    45    55

>>  y2=cumprod(x)

y2 =

      1      2      6    24      120   720   5040    40320    362880   3628800


14).matlab中sind、cosd、tand以角度为单位,sin、cos、tan函数等都是以弧度为单位.

对于三角函数计算,在系统默认函数前后面加"d"是直接进行角度计算,这里"d"代表"degree",例如sind(30) = 0.5,效果与sin(30*pi/180)一样,其他的有cosd、tand等。

附表: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


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


练习:

1. 验证魔方矩阵。

>>a=magic(10)


a =

    92    99     1     8    15    67    74    51    58    40

    98    80     7    14    16    73    55    57    64    41

     4    81    88    20    22    54    56    63    70    47

    85    87    19    21     3    60    62    69    71    28

    86    93    25     2     9    61    68    75    52    34

    17    24    76    83    90    42    49    26    33    65

    23     5    82    89    91    48    30    32    39    66

    79     6    13    95    97    29    31    38    45    72

    10    12    94    96    78    35    37    44    46    53

    11    18   100    77    84    36    43    50    27    59


>> sum( a(2 ,:) )

ans =

   505

>> sum( a(: ,5) )

ans =

   505

>> sum( diag(a) )

ans =

   505

>> sum( diag(rot90(a)) )

ans =

   505



2. 简单绘图

先生成维度相同的两个数组x,y,相当于确定了一组点的x-y坐标,然后用plot(X,Y)命令,把这些点连接起来并显示。就是函数y的图像了。

x=1:0.01:10;

y=sin(x).*cos(50*x);

plot(x,y,'r')                   % 参数‘r’表示用红色绘图


x=rand(1,50);

y=rand(1,50);

plot(x,y,'r*') 


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


         综合项目练习:生成随机彩色网格图


         

教学目标:通过本项目综合掌握随机函数、图形显示与绘图原理、矩阵的赋值等知识点。


1)repmat 复制矩阵

B = repmat(A,m,n)
       B = repmat(A,[m n])
       B = repmat(A,[m n p...])

%repmat 复制矩阵

A=randi([0,9],2,2)

B=zeros(10,10);

B(1 : 4 , 1 : 6)=repmat(A , 2 , 3);

B


%如果矩阵的一大片需要赋相同的值,则可以直接把某个值赋给矩阵的这个切片。

A=randi([0,9],2,2)

B=zeros(10,10) ;

B(1 : 4 ,1 : 6)=repmat(A , 2 , 3) ;

B(5 : 10 , 1 : 6)=1 ;

B(5 : 10 , 7 : 10)=2 ;

B



这是一个处理大矩阵且内容有重复时使用,其功能是以A的内容堆叠在(MxN)的矩阵B中,B矩阵的大小由MxN及A矩阵的内容决定,如果A是一个3x4x5的矩阵,有B = repmat(A,2,3)则最后的矩阵是6x12x5


2)imshow函数

通过下面代码,理解图像的存储格式,以及显示方式imshow

 imshow函数:

(1)作用: imshow函数可以把一个二维矩阵(灰度图)或者三维矩阵(彩图)以图片形式显示出来。

(2)处理的数据类型: imshow函数处理的矩阵的数据类型可以是uint8类型(数值范围0-255),和double类型(数值范围0-1)。

imshow用法 

pic1=imread( ' F:\bird_gray.jpg ' ); %imread读取一个图片,并以矩阵方式存给变量pic

size(pic1)                          %显示矩阵pic的尺寸

class(pic1)                         %显示矩阵pic的数据类型,默认为uint8类型

pic2=double(pic1)/255;    %思考:为啥要除以255?可替换为im2double(I)

class(pic2)

imshow(pic1);   %把矩阵pic1(uint8类型)当成图片来显示

imshow(pic2);   %把矩阵pic2(double类型)当成图片来显示

imtool(pic1);      %把矩阵pic当成图片,并用imtool 工具来探索图片信息。


Matlab图像处理中mat2gray、im2double和double的区别:


(1)double(I):直接将图像I的灰度数据转换为double类型;是对矩阵I进行双精度化处理,double的范围是-4.1143~476.1737;就是简单地把一个变量类型转换成double类型,数值大小不变;
比如 a=6 是个unit8类型的话,double(a)的结果还是6,不过现在这个6是double类型的。

(2)im2double(I):将灰度图像I转换成double类型,必要时将数据rescaling(归一化)。 如果输入是unit8、unit16或者二值的logical类型,则函数im2double将其值归一化0~1之间,当然就是double型的了。如果输入本身就是double类型,输出还是double类型,并不进行归一化。相当于I=double(I)/255.

(3)在图像处理中,double函数只是将读入图像的uint8数据转换为double类型,一般不使用,常用的是im2double函数,将uint8图像转为double类型,范围为0-1,如果是255的图像,那么255转为1,0还是0,中间的做相应改变。


im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;

mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。

****************假设某图像数据A(uint8格式)**********************

A =235 200 89 20

>> double(A) %返回与原矩阵数值相同但类型为double的矩阵;

ans =235 200 89 20

>> im2double(A)
%返回矩阵类型:double;数值范围[0 1] ,0对应uint8中的0;1对应uint8中的255;

ans =0.9216   0.7843   0.3490   0.0784

>> mat2gray(A) %对原矩阵归一化

ans =1.0000   0.8372   0.3209    0

****************假设矩阵A为一般二维数组,非图像数据(double格式)**********************

A =   235   200   89    20

>> double(A)

ans =235   200   89   20

>> im2double(A)

ans =235   200   89   20

>> mat2gray(A)

ans =1.0000   0.8372   0.3209   0


%灰度图与彩色图的关系

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


clc

level=ones(300,300);

%显示红绿蓝三种纯色的方法。

r=cat( 3 , level*1 , level*0 , level*0 );   %纯红

g=cat( 3 , level*0 , level*1 , level*0 );  %纯绿

b=cat( 3 , level*0 , level*0 , level*1 );   %纯蓝

subplot(2,3,1) , imshow(r);

subplot(2,3,2) , imshow(g);

subplot(2,3,3) , imshow(b);


%红绿蓝三种成分随意组合会如何?

color1=cat( 3 , level*0 , level*0 , level*0 );  %纯黑

subplot(2,3,4) , imshow(color1);

color2=cat( 3 , level*1 , level*1 , level*1 );  %纯白

subplot(2,3,5) , imshow(color2);

color3=cat( 3 , level*1 , level*1 , level*0 );  %黄色

subplot(2,3,6) , imshow(color3);


更加随意组合后:



%灰度图:当RGB三通道的数值相同时,显示效果为灰度图。

A1=ones(100,100);

subplot(1 , 3 , 1)   ,  imshow(A1)

A2=ones(100 , 100)*0;

subplot(1 , 3 , 2)   , imshow(A2)

A3=ones(100 , 100)*0.5;

subplot(1 , 3 , 3)  ,  imshow(A3)


更加随意组合后:






3)用什么方法才能生成如下的3*3网格的随机彩色图?


提示:如果能把一个3*3像素的小彩图,每个像素点都膨胀n倍,不就可以达到要求了?

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

clear all

k=3;             %设置网格为k*k

n=100;         %设置膨胀倍数n

rgb1=rand( k , k , 3 );

imshow(rgb1)        


%下面开始膨胀操作。

rgb=zeros( k*n , k*n , 3 );     %初始化rgb三维数组,初始值都设为0

%膨胀小图中的第一个像素...

把rgb1(1,1,3)复制100*100,放到rgb的左上角。

其他像素的操作类似..







%补齐以上代码,然后运行imshow,显示随机彩色网格图。

imshow(rgb)



%如果想查看每个通道的灰度图,则采用 imshow(rgb2(:,:,1)) imshow(rgb2(:,:,2)) imshow(rgb2(:,:,3))命令




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



作业1:通过学习本节的知识,编程生成一个4*4网格的随机彩色图,既共16个单元格(每个单元格子大小为100*100像素)。每次运行代码,都能得到不同颜色分布的随机图案。



作业2:(1)采用randi([1,300],[10,10])生成一个10*10的随机整数矩阵A;(2)采用逻辑索引的方法,索引出矩阵A中所有可以被3整除的元素;(3)并计算出上一步索引出的元素的总数;(4)找出A中所有不能被3整除也不能被7整除的元素的总数;(5)把A中所有可以被3整除的元素替换成0。






作业3:求任意给定的一个五位正整数的个位、十位、百位,千位、万位。

效果如下:


要求应用两种方法。

方法1,采用num2str函数以及字符数组的方法。

方法2,采用fix()等函数方法。





 作业4:(1)利用randn()函数生成一个5*10的矩阵A,用ceil处理A得到矩阵x,用 floor处理A得到矩阵y,用round处理A得到矩阵z,用fix处理A得到矩阵t;

(2)计算x+y-(z+t);







拓展作业:

思考:如何改造随机彩图程序,生产类似如下的图像。下图为10*10的网格图,其中十字架形状是彩色的,其他部分是灰度图。

如果反之该如何设计?即。十字架是灰度图,其他部分是彩色的。

大家可以自己设计图案形状(如圆形、三角形、甚至阿拉伯数字)。网格的规模自己来定。