通信系统仿真

崔春雷

目录

  • 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 课程标准
数组与矩阵常用函数

                                  

                        数组与矩阵常用函数

  1. MATLAB中的特殊矩阵与数组

在本节中,我们将讨论学习一些创建一些特殊数组的函数。对于这些函数,单个参数创建一个正方形数组,双参数创建矩形数组。


[   ]

生成空矩阵

eye(n,m)

生成n×m单位矩阵

ones(n,m)

生成全部元素是1的矩阵

zeros(n,m)

生成全部元素是0的矩阵

magic(n)

生成魔方矩阵

rand(n,m) 

生成0~1之间均匀分布的随机矩阵

randi([min,max],n,m)生成[min,max]范围内nm列的随机整数矩阵
randn(n,m)生成均值为0,方差为1的标准正态分布的随机矩阵

randperm(n)

 返回一行包含从1n的整数的乱序(洗牌算法)


(1)zeros( )函数是用来创建一个全零的数组 -例如 :

>> zeros(5)              %生成5行5列的全0矩阵

ans =

     0     0     0     0     0

     0     0     0     0     0

     0     0     0     0     0

     0     0     0     0     0

     0     0     0     0     0


(2)ones( )函数创建一个所有元素为1的数组 -例如 

>> ones(4,3)

ans =

     1     1     1

     1     1     1

     1     1     1

     1     1     1


如果需要一个大小为10*10,且全部元素都是圆周率pi的矩阵,可以采用:



(3)eye( )函数创建一个单位矩阵。例如 

>> eye(4)

ans =

     1     0     0     0

     0     1     0     0

     0     0     1     0

     0     0     0     1

   

(4)魔方 magic( )函数

magic( )函数创建一个魔术方阵。这需要一个参数,指定正方形的大小。 参数必须是大于或等于3的标量。

>> magic(3)

ans =

     8     1     6

     3     5     7

     4     9     2

     

>> magic(4)

ans =

    16     2      3     13

     5     11    10     8

     9      7       6    12

     4     14    15      1



(5)rand( )函数

rand( )函数在(0,1)上创建均匀分布的随机数的数组 

调用格式:rand(n,m),这里n,m是生成nm列处于0~1之间的随机数

>> rand(3, 5)
ans =
    0.8147    0.9134    0.2785    0.9649    0.9572
    0.9058    0.6324    0.5469    0.1576    0.4854
    0.1270    0.0975    0.9575    0.9706    0.8003

我们当然可以根据自己需要生成任何范围内的随机数:比如想生成处于 0-2pi 的随机数,只需要将上面的式子改为a=2*pi*rand(2,3)

生成结果:


练习1:模拟生成全班50个同学的期末成绩,要求所有人成绩都在60-100之间随机分布。



(6)随机整数: randi函数

格式:randi([min,max],n,m);生成[min,max]范围内nm列的随机整数矩阵

例子:randi( [-2 , 10] , 2 , 3 )

得到:

也可以写成:randi( max , n , m);生成1-max范围内nm列的随机整数矩阵

>> randi( 20, 2 , 3 )

ans =

    17    13    17

    16     8     11


练习2:模拟生成全班50个同学的期末成绩,要求所有人成绩都在60-100之间随机分布,且成绩为整数。



(7) randperm()函数用法返回一行包含从1到n的乱序的整数序列。


语法:p = randperm(n) ;  返回一行包含从1n的乱序的整数序列。

相当于对1- n之间的整数进行‘洗牌’处理!

>> x=randperm(10)

x =

     4     8     3     1     2     7     6    10     9     5 

p = randperm(n,k) 返回一行从1n的整数中的k个,且这k个数是不重复的。

>> x=randperm(10,5)

x =

     7     1     2     3     4


randperm是不重复的重排采样(k-permutations),randi( [min,max],n,m )则允许重复采样




(8)正态分布的随机数: randn函数

randn函数可以用于生成符合正态分布的随机数

格式:randn(n,m);生成n行,m列,以0为中心的正态分布随机数

>> s=randn(3,4)

s =

   -1.7947    0.1001   -0.6003    1.7119

    0.8404   -0.5445    0.4900   -0.1941

   -0.8880    0.3035    0.7394   -2.1384

再看一个例子,模拟中国男性的身高分布:

y=randn(1,100000)*10+170    %生成以170为中心,方差为10的100000个正态分布的随机数

histogram(y,100)                       %画出这100000个数据的直方图


tips:直方图的纵轴代表每个区间元素的数目。 

如果要获得一个服从正态分布N(u,o*o)的随机数,可执行randn(n)*o+u


练习3:模拟生成50个同学的毕业后的月收入,以5000为正太分布中心,方差为800。




2.多维数组(矩阵)

具有二维以上的数组在MATLAB中被称为多维数组。MATLAB中的多维数组是正常二维矩阵的扩展。

可以用如下方式生成3×3×2数组

a(:, :, 1)  = [ 7 9 5; 6 1 9; 4 3 2];
a(:, :, 2)  = [ 1 2 3; 4 5 6; 7 8 9];


>> size(a)
ans =
    3     3     2
   
>>disp(a)
a(:,:,1) =
    7     9     5
    6     1     9
    4     3     2
a(:,:,2) =
    1     2     3
    4     5     6
    7     8     9


如何理解多维数组?

比如,某个三维数组结构为 4×5×6 ,那么可以想象成一张纸(上面写了4行5列的数字,构成一个4×5的平面矩阵),然后再在这张纸下面铺一层纸(上面又写了4行5列的数字),,,如此反复,一共6层纸,每层纸上面都有4行5列的数字

思考: 4×5×6×3的多维数组该怎么理解?


还可以使用ones( )zeros( )rand( )函数来创建多维数组。

例如:

>> b1 = rand(4,3,2)    %创建3维随机数组

b1(:,:,1) =
    0.1419    0.9595    0.9340
    0.4218    0.6557    0.6787
    0.9157    0.0357    0.7577
    0.7922    0.8491    0.7431

b1(:,:,2) =
    0.3922    0.0318    0.8235
    0.6555    0.2769    0.6948
    0.1712    0.0462    0.3171
    0.7060    0.0971    0.9502

>> b2 = rand(4,5,3,2)   %创建4维随机数组

b2(:,:,1,1) =

   0.7545    0.8031    0.1591    0.1323    0.5200
   0.5838    0.3991    0.0683    0.4465    0.6910
   0.3220    0.5414    0.7012    0.0178    0.9038
   0.0883    0.0932    0.7149    0.2408    0.0576


b2(:,:,2,1) =

   0.9562    0.6353    0.4826    0.4231    0.8345
   0.0078    0.4840    0.1683    0.6729    0.5186
   0.3883    0.6426    0.5510    0.1561    0.0681
   0.7471    0.5126    0.8264    0.2917    0.7398


b2(:,:,3,1) =

   0.0325    0.0088    0.9800    0.0798    0.6005
   0.5304    0.5064    0.3867    0.0828    0.0111
   0.8068    0.7801    0.5926    0.0801    0.9688
   0.1476    0.2221    0.2859    0.7292    0.1135


b2(:,:,1,2) =

   0.6998    0.3476    0.9855    0.6162    0.7561
   0.1098    0.3864    0.0846    0.3965    0.3543
   0.4801    0.0522    0.6349    0.6831    0.5971
   0.2999    0.1226    0.3099    0.4223    0.1301


b2(:,:,2,2) =

   0.6774    0.4563    0.5681    0.3713    0.3607
   0.4515    0.4603    0.9487    0.5944    0.9744
   0.2761    0.0806    0.8023    0.4595    0.0372
   0.1897    0.9903    0.5720    0.3275    0.0688


b2(:,:,3,2) =

   0.4263    0.9989    0.5690    0.2381    0.4176
   0.7870    0.5811    0.2451    0.3188    0.2878
   0.1803    0.6969    0.8152    0.8087    0.1384
   0.5786    0.7465    0.2723    0.1355    0.6801


也可以使用 cat( ) 函数来构建多维数组。它沿着指定的维度连接数组列表. 

cat()函数的语法是 :B=cat(dim,A1,A2...)  

% 其中: B是创建的新阵列;

% A1,A2,...是即将要拼接的数组;   

% dim是连接数组的维度方向,dim=1为平面上的竖直方向,dim=2为平面上的水平方向,dim=3为从第上层平面指向最底层平面的方向





  • 例1:

  • clc

  • a = [ 1,2,3  ; 4,5,6  ; 7,8,9 ];

  • b = [ 1 0 1 ; 2  0 2 ; 3 0 3 ]

  • c1 = cat(1,a,b)      % 表示把a,b矩阵纵向拼接

  • c2 = cat(2,a,b)      % 表示把a,b矩阵水平拼接

  • c3 = cat(3,a,b)      % 表示把a,b矩阵沿Z轴方向拼接



例2:

x1 = [9 8 7; 6 5 4; 3 2 1];
x2 = [1 2 3; 4 5 6; 7 8 9];
x3 = [2 3 1; 4 7 8; 3 9 0];
x4 = randi([-10,10],3,3);

y=cat(3,x1,x2,x3,x4);   %把x1,x2 , x3, x4 这4个平面矩阵按z轴方向拼接成一本“书”。
disp(y)
y(:,:,2)
 
%把第2面的数据全部索引出来
y(1,3,:)  %把所有面的第1行第3列的数据全部索引出来

执行上面示例代码,得到以下结果 -

y(:,:,1) =
    9     8     7
    6     5     4
    3     2     1
y(:,:,2) =
    1     2     3
    4     5     6
    7     8     9
y(:,:,3) =
    2     3     1
    4     7     8
    3     9     0
y(:,:,4) =
    7     0     3
    8     5   -10
   -2     3    -5
ans =
    1     2     3
    4     5     6
    7     8     9
ans(:,:,1) =
    7
ans(:,:,2) =
    3
ans(:,:,3) =
    1
ans(:,:,4) =
    3


计算机存储图片的原理:

黑白模式(单色图像、二值图像):像素只有黑白以及中间的过渡灰色。

        图片由黑色区域和白色区域组成。每个像素的值在0-1之间或0-255之间,根据不同体系);


         如,0-1体系里,0(纯黑),1(纯白),0.4,0.78等为灰色。


按照0-255体系,则有:





RGB彩色模式:每个像素点都有三盏灯RGB,通过RGB三盏灯的亮度就可以组合出该像素点的颜色和亮度!


LED显示器的一个像素的结构:




显示屏就是由很多个像素点组成的像素阵列,如经典的1024*768显示屏:


为什么三原色是红绿蓝而不是紫色、粉色、或者橙色呢?是因为人类的视网膜上面的视锥细胞对红绿蓝三色最敏感!



总结:

(1)每一个像素由RGB三个分量组成。注意,RGB三个分量值相同时为灰色(或黑白色)。

(2)一副彩色数字图像由R, G, B三个通道构成,可以看做一个三维数组。

(2)每个分量各占8位,其范围为0~255,每个像素24位比特(8*3bit,3字节)。

 


关于显卡,这里直接引用下百度百科:

显卡全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来,同时显卡还是有图像处理能力,可协助CPU工作,提高整体的运行速度。

数据从离开CPU到达显示屏,中间必须通过如下4个步骤:

1.从总线进入GPU(图形处理器):将CPU送来的数据送到北桥,再送到GPU里面进行处理。

2.将芯片处理完的数据送到显存。

3.从显存读取出数据再送到随机读写存储数—模转换器进行数模转换的工作。(但是如果是DVI接口类型的显卡,则不需要经过数字信号转模拟信号。而直接输出数字信号。)

4.从DAC进入显示器:将转换完的模拟信号送到显示屏。

显卡就是起数据处理和数模转换的作用,像数模转换、模数转换这些都是数字信号处理、数字电路之类的学科的知识了~

以上便是CPU到显卡再到显示器再到人眼的过程。




练习:设计一个3*3*3的3维数组pic,通过imshow( )函数显示pic, 在屏幕上得到一个3行3列(一共9个像素点)的小图片,这个图片上的颜色分布为:

clc

r=[ 0  1  0.5

      1  0  0

      1  0  1 ]


g=[ 0  1  0.5

      0  1  0

      1  1  0 ]


b=[ 0  1  0.5

      0  0  1

      0  1  1 ]


pic=cat(3,r,g,b)

imshow(pic)



%在计算机系统内,RGB颜色常用的是0-255的数值描述方式(数据类型为uint8类型)。此颜色系统可以描述16581375种颜色! 


                             中国传统颜色之美

https://www.bilibili.com/video/BV1zv411K7Bt

http://zhongguose.com/

https://colors.ichuantong.cn/

颜色表: https://blog.csdn.net/kc58236582/article/details/50563958


①红色系
E3B4B8合欢红00:06,F47983桃红00:08,9D2933胭脂红00:11
D42517鹤顶红00:14,ED5736妃色00:18,FF2121大红00:21
F05A46曲红00:24,EF7A82嫣红00:28,ED556A山茶红00:30
F35336彤00:33,F1939C春梅红00:37,DE2A18夕阳红00:40
CE5777月季红00:43,FF461F朱砂00:46,FF461F檀00:49
7C1823枣红00:52,D11A2D枫叶红00:56,ED3321樱桃红00:59
FF4C00朱红01:02,C82111F殷红01:05,F03752海棠红01:08
F2EAE9淡绯01:12,A7535A满江红01:15,FF2D51火红01:18
FF3300炎01:21,894E54烟红01:24,C04851玉红01:27
F1908C石榴红01:30,A6522C绀红01:34,8C4356绛紫01:37
C83C23绯红01:40,A98175绾01:43,ED5A65艳红01:46
CB3A56茜色01:49,EE3F4D茶花红01:53,C3272B赤01:56
DC3023酡红01:59,F9906F酡颜02:03,F05654银红02:06
C02E38高粱红02:08,EF3473品红02:12,FF4E20丹02:15

②白色系
D6ECF0月白02:19,FFFBF0象牙白02:22,E0F0E9素02:25
FFFFFF精白02:28,F0F0F4铅白02:32,F2ECDE缟02:35
D6ECF0花白02:38,D1D9E0苍白02:41,F3F9F1荼白02:44
E3F9Fd莹白02:48,EEDEB0牙色02:51,E9E7EF银白02:54
F2FDFF雪白02:57,E9F1F6霜色03:00,FEEFE8鱼肚白03:04
Ps:象牙白也可以是FFFEF8,感觉颜色都差不多


③黄色系

FFC773姜黄03:08,C89B40昏黄03:10,FF8C31杏红03:13
FFA631杏黄03:16,D3BE7D枯黄03:19,C9DD22柳黄03:22
EAFF56樱草色03:25,FF7500橘红03:28,FF8936橘黄03:31
FA8C35橙色03:34,FFA400橙黄03:37,CA6924琥珀03:40
896C39秋色03:43,D9B611秋香色03:46,F0C239缃色03:49
A29B7C苍黄03:52,B35C44茶色03:55,FAFF72鸭黄03:58
FFF143鹅黄04:01


④绿色系
7FECAD缥04:06,9ECCAB明绿04:08,BACF65果绿04:12
207F4C薄荷绿04:14,8CC269水绿04:18,61AC85淡绿04:20
1BA784竹绿04:23,BDDD22嫩绿04:27,20A162翠绿04:29
3DE1AD翡翠色04:32,A4E2C6艾绿04:35,B7D07A芦苇绿04:38
223E36苍绿04:41,AFDD22柳绿04:45,43B244鲜绿04:47


⑤青色系

2EDFA3玉色04:51,7BCFA6石青04:54,1BD1A5碧色04:57
0EB83A葱青05:00,C0BD7青白05:03,00E079青翠05:06
00E09E青色05:10,424C50雅青05:12,E0EEE8鸭卵青05:15


⑥蓝色系
2f90b9云山蓝05:20,baccd9云水蓝05:22,2b73af品蓝05:25
1677b3天蓝05:28,4b5cc4宝蓝05:31,93b5ef星蓝05:34
101f30暗蓝05:37,c6e6e8海天蓝05:40,66a9c9涧石蓝05:43
1e9eb3翠蓝05:46,134857苍蓝05:49,29b7cb蔚蓝05:52
2b2e7e藏蓝05:55,2177b8虹蓝05:58,d0dfe6远天蓝06:01
065279靛蓝06:04,425066黛蓝06:07


⑦紫色系
cca4e3丁香色06:12,1e131d乌梅紫06:14,310f1b墨紫06:17
a35c8f扁豆紫06:20,5c2223暗玉紫06:23,2b1216李紫06:26
806d9c槿紫06:29,c06f98樱草紫06:32,801dae青莲06:35
541e24猪肝紫06:38,56004f紫棠06:41,9b1e64苋菜紫06:44
4c1f24葡萄紫06:47,8076a3藤萝紫06:50,ad6598豆蔻紫06:53
4d1018酱紫06:56,b0a4e3雪青06:59,574266黛紫07:02
322f3b龙葵紫07:05,681752牵牛紫07:02


⑧黑色系
725e82乌色07:13,392f41乌黑07:15,758a99墨灰07:18
50616d墨色07:21,161823漆黑07:24,808080灰07:27
622a1d玄色07:30,3d3b4f玄青07:34,493131缁色07:36
395260苍黑07:39,75664d黎07:42,000000黑07:45
4a4266黛07:48,6b6882黝(音同友)07:51,5d513c黧(音同黎)07:54
41555d黯07:57


⑨金色系
a78e44乌金08:02,f2be45赤金08:04,eacd76金色08:07





多维数组的应用实例:三维数组作为图片。

imshow(pic)函数:imshow(pic)可以把三维数组pic作为一个图片来显示。

在使用imshow(pic)函数的时候:如果矩阵pic的数据类型为double类型,则pic的数据的值应该是0-1范围;如果pic为uint8类型,则pic的数据的值应该是0-255范围!


例:灰度图即,对任何一个像素点,其rgb三个通道的值是相同的

k=0.65 ;                                   %参数k控制灰度

pic_gray=ones(100,100,3)*k;   

%或者ones(100,100)*k也可以,此时imshow()自动把RGB三个通道都用该二维矩阵来显示。

imshow(pic_gray)                     %把2维数组当成黑白图片来显示。






例:RGB三通道的值对颜色的控制

kr=0.631;

kg=0.213;

kb=0.323;

o=ones(300,300);

pic_r= o*kr;

pic_g=o*kg;

pic_b=o*kb;

pic_color2=cat(3,pic_r,pic_g,pic_b);


imshow(pic_color2)



还可以使用实时编辑器,采用数值滑块,动态调整颜色。



例:随机函数生产图片

pic_gray1=rand(100,100);

imshow(pic_gray1)       %把2维数组当成黑白图片来显示。



pic_color2=rand(100,100,3);

imshow(pic_color2)      %把三维数组当成三通道彩色图片来显示。







0-1模式(double类型)图像显示:


%比如需要柿子色,查表后,程序可以这么改:

kr=237;

kg=110;

kb=69;


o=ones(300,300);

pic_r=o*kr/255;

pic_g=o*kg/255;

pic_b=o*kb/255;


pic_color2=cat(3,pic_r,pic_g,pic_b);

imshow(pic_color2)






0-255模式(uint8类型)图像显示:

如果采用0-255模式来显示图像,则数据类型对应为uint8类型!


kr=238;

kg=39;

kb=70;


o=ones(300,300);


pic_r= o*kr;

pic_g=o*kg;

pic_b=o*kb;


pic_color1=cat(3,pic_r,pic_g,pic_b);   %把r,g,b三个二维数组拼接成三维数组

pic_color2=uint8(pic_color1);             %转换为uint8类型


imshow(pic_color2)



试一下显示如下的蓝色:




0-255模式(uint8类型)图像显示:

         

如,显示 'F03752海棠红',首先要把海棠红的16进制的颜色代码转换为十进制。

kr=hex2dec('F0');

kg=hex2dec('37');

kb=hex2dec('52');


o=ones(500,500);

pic_r=o*kr;

pic_g=o*kg;

pic_b=o*kb;


pic_color1=cat(3,pic_r,pic_g,pic_b);

pic_color2=uint8(pic_color1);            %转换为uint8类型

imshow(pic_color2)










3.矩阵与数组的常用函数

MATLAB提供以下函数来对数组内容进行排序,旋转,排列,重新成形或移位等操作(红色字体需重点掌握).                                                                                                           

函数描述
length向量的大小或数组的长度
ndims数组的维数
numel数组的元素数量
size数组的维度
iscolumn确定输入是否为列向量
isempty确定数组是否为空
ismatrix确定输入是否为矩阵
isrow确定输入是否为行向量
isscalar确定输入是否为标量
isvector确定输入是否为向量
blkdiag从输入参数构造块对角矩阵
circshift循环移位
ctranspose复共轭转置
diag矩阵对角矩阵和对角线
flipdim沿着指定的尺寸翻转数组
fliplr从左到右翻转矩阵
flipud向下翻转矩阵
max/min求数组的最大值/最小值
sum求数组的和
repmat复制和平铺数组
reshape重塑数组(变形)
rot90(A,N)逆时针旋转矩阵A,N*90度
shiftdim移动维度
issorted确定设置元素是否按排序顺序
sort按升序或降序排列数组元素
sortrows按升序排列行
squeeze删除单例维度
transpose转置
vectorize向量化表达式



3.1 常用函数size( )、numel( )、length( )、ndims( )

(1)size( )函数

s=size(A),当只有一个输出参数时,返回一个行向量,该行向量的第一个元素数组的行数,第二个元素是数组的列数。

[r,c]=size(A),当有两个输出参数时,size函数将数组的行数返回到第一个输出变量,将数组的列数返回到第二个输出变量。

如果在size函数的输入参数中再添加一项,并用1或2为该项赋值,则size将返回数组的行数或列数。 其中r=size(A,1)该语句返回的时数组A的行数c=size(A,2) 该语句返回的时数组A的列数。

运行下面代码试试看:

A=[1  2  3  4 ; 5  6 7  8 ; 9 10 11 12];

s=size(A)

[r,c]=size(A)

size(A,1)

size(A,2)

输出:   


(2)numel( )函数

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

A=[1   2   3    4 ; 

      5   6   7    8 ; 

      9  10  11 12]

t=numel(A)


t =

     12


(3)length( )函数

n=length(A):如果A为非空数组,返回行数和列数两者之间数值较大的那一个值,即相当于执行了max(size(A));

如果A为空数组,则返回0;如果A是一个向量则返回A的长度。

length(A)的功能相当于max( size(A) ), 若A为非空数组,返回A的最大维数;若A为空数组,返回A中最长的非0维数。




(4)ndims( )函数

ndims(A)返回数组A的维度的数量。

>> A=rand(3,5,4,3,2);

>> ndims(A)

ans =

     5



综合实例:




3.2 数组求和:sum( )

语法:

S = sum(A)

S = sum(A,'all')

S = sum(A,dim)

S = sum(A,vecdim)


说明:

(1)S = sum(A) 返回 A 沿大小不等于 1 的第一个数组维度的元素之和。

         如果 A 是向量,则 sum(A) 返回元素之和。

         如果 A 是矩阵,则 sum(A) 将返回包含每总和的行向量。

         如果 A 是多维数组,则 sum(A) 沿大小不等于 1 的第一个数组维度计算,并将这些元 素视为向量。此维度会变为 1,而所有其他维度的大小保持不变。


(2) S = sum(A,'all') 计算 A 的所有元素的总和。


(3)S = sum(A,dim) 沿维度 dim 返回总和。例如,如果 A 为矩阵,则 sum(A,2) 是包含每一总和的向量;则 sum(A,1) 是包含每一总和的向量。


(4)S = sum(A,vecdim) 根据向量 vecdim 中指定的维度对 A 的元素求和。例如,如果 A 是矩阵,则 sum(A,[1 2]) 是 A 中所有元素的总和,因为矩阵的每个元素包含在由维度 1 和 2 定义的数组切片中。


例:

%对向量求和

x=1:100;

s_x=sum(x)



%对矩阵求和

a=[1,  2,  3,  4 ; 

      5,  6,  7,  8 ; 

      9, 10,11,12]

s_col1=sum(a)            %按方向求和(默认)

s_col2=sum(a,1)         %按方向求和

s_row=sum(a,2)          %按方向求和

s_all1=sum(a,'all')        %所有元素之和

s_all2=sum( sum(a) )   %求矩阵所有元素之和的方法2(sum函数的嵌套使用)

s_all3=sum( a(:) )         %求矩阵所有元素之和的方法3(把矩阵a展成一长列后再求和)

运行以上代码:




3.3 数组求最值:max()/ min()

这里只拿最大值函数max()举例,最小值函数min( )的用法类

max:求数组的最大元素

语法:

M = max(A)

M = max(A,[],dim)

[M,I] = max(___)

M = max(A,[],'all')

M = max(A,[],vecdim)

C = max(A,B)

说明:

(1)M = max(A) 返回数组的最大元素。

如果 A 是向量,则 max(A) 返回 A 的最大值。

如果 A 为矩阵,则 max(A) 是包含每一列的最大值的行向量。

如果 A 是多维数组,则 max(A) 沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。此维度的大小将变为 1,而所有其他维度的大小保持不变。如果 A 是第一个维度长度为零的空数组,则 max(A) 返回与 A 大小相同的空数组。


(2)M = max(A,[],dim) 返回维度 dim 上的最大元素。

        例如,如果 A 为矩阵,则 max(A,[],2) 是包含每一行的最大值的列向量。


(3)[M,I] = max(___) 使用先前语法中的任何输入参数,查找 A 的最大值的索引,并在输出 向量 I 中返回这些索引。如果最大值出现多次,则 max 返回对应于第一次出现位置的索引。


(4)M = max(A,[],'all') 查找 A 的所有元素的最大值。


(5)M = max(A,[],vecdim) 计算向量 vecdim 所指定的维度上的最大值。例如,如果 A 是矩阵,则 max(A,[],[1 2]) 计算 A 中所有元素的最大值,因为矩阵的每个元素都包含在由维度 1 和 2 定义的数组切片中。


(6)C = max(A,B) 返回从 A 或 B 中提取的最大元素的数组。


求向量最值:

A = [23 42 37 18 52];

M = max(A)

M = 52


最大复数元素:创建一个复数向量并计算其最大元素,即具有最大幅值的元素。

A = [-2+2i    4+i    -1-3i];

max(A)

ans = 4.0000 + 1.0000i


求矩阵中的最大元素:创建一个矩阵并计算每列中的最大元素。

A = [2   8    4 ; 

        7   3    9];

M = max(A)

M = 1×3

        7     8     9


每个矩阵中的最大元素:创建一个矩阵并计算每行中的最大元素。

A = [1.7   1.2   1.5 ; 

        1.3   1.6   1.99]

M = max(A,[],2)

M = 2×1

       1.7000

       1.9900


最大元素及其索引创建一个矩阵 A 并计算每列中的最大元素,以及这些元素在 A 中显示的行索引。

例:

>> A=randi(30,4,4)

A=

    21    14     6    22

    10    12    15    23

    29    23    14     9

     2    24    20    21


>>[M,I] = max(A)      %M表示每一列上的最大值,I表示此最值在这一列上的位置

M =

     29    24    20    23

I =

      3     4      4      2



所有维度上的最大值,可以在向量维参数中指定每个维度,或使用 'all' 选项。

b1=randn(4,5)

max(b1,[],'all')     %方法1

max(b1,[],[1,2])   %方法2,朝1方向和2方向搜索最大值

max(max(b1))     %方法3

max(b1(:))           %方法4,把b1变为一个列向量,再求最大值




综合实例:

A = randn(6,5)


M1 = max(A)

M2 = max( A, [ ] , 2 )

[m,n] = max(A)


m1=min( min(A) )

m2=min( A(:) )

m3=min( A,[ ],'all' )







3.4 排序数组函数 sort( ) 

排序函数sort()的语法:

B = sort(A)

B = sort(A,dim)

B = sort(___,direction)

说明

(1)如果 A 是向量,则 B = sort(A)按升序对 A的元素进行排序。

     如果A是矩阵,则 sort(A)会将A的列视为向量并对每列进行排序。

     如果A是多维数组,则sort(A)会沿大小不等于 1 的第一个数组维度计算,并将这 些元素视为向量。


(2)B = sort(A,dim) 返回A沿维度dim的排序元素。

例如,如果A是一个矩阵,则 sort(A,2)对每行中的元素进行排序。


(3) B= sort(___,direction) 使用上述任何语法返回按direction指定的顺序显示的A的有序元素。'ascend'表示升序(默认值),'descend'表示降序。


例1:创建一个行向量,并按升序对其元素排序。

A = [9 0 -7 5 3 8 -10 4 2];
B = sort(A)             %对行数组A进行升序排序后给B
C1 = sort(A,'descend')  %对行数组A进行降序排序后给C1
C2 = B( end : -1 : 1 )         %对行升序排序得到的数组B,逆向索引后给C2,同样得到降序排序



例2:创建一个矩阵,分别按按升序降序每一/每一列排序。

A = [10 -12 4 8 ; 6 -9 8 0 ; 2 3 11 -2 ; 1 1 9 3]
B1 = sort(A)                     %按
升序
B2 = sort(A,
'descend')     %按降序
B11 = sort(A,1)                 %按
升序
B22 = sort(A,1,
'descend')  %按降序

B3 = sort(A,2)                   %按
升序
B4 = sort(A,2,
'descend')   %按降序
     
    运行结果:
   


综合练习:

 x4 = [10 -12 4 8; 6 -9 8 0; 2 3 11 -2; 1 1 9 3]

lie_max=max(x4)                                     %列最大值

hang_max=max(x4,[],2)                           %行最大值

all_max=max(x4(:))                                  %全体最大值


lie_sheng_sort=sort(x4,1)                         %按升序排序

hang_sheng_sort=sort(x4,2)                     %按升序排序

lie_jiang_sort=sort(x4,1,'descend')           %按序排序

hang_jiang_sort=sort(x4,2,'descend')       %按序排序


x4 =

    10   -12     4     8

     6    -9      8      0

     2     3      11    -2

     1     1       9      3

lie_max =

    10     3    11     8

hang_max =

    10

     8

    11

     9

all_max =

    11

lie_sheng_sort =

     1   -12     4    -2

     2    -9      8     0

     6     1      9     3

    10    3     11     8

hang_sheng_sort =

   -12     4     8    10

    -9     0     6     8

    -2     2     3    11

     1     1      3     9

lie_jiang_sort =

    10     3    11     8

     6      1     9     3

     2     -9     8     0

     1   -12     4    -2

hang_jiang_sort =

    10     8     4   -12

     8      6     0    -9

    11     3     2    -2

     9      3     1     1



3.5 数组变形函数——reshape

例1:

已知矩阵A由3×4组成,则 B=reshape(A,2,6)将矩阵A由3×4改变为2×6,并把这个2×6矩阵赋给B;

       


例2:

B=reshape(A,9,1);将矩阵A由3×3改变为9×1即9行1列(也可以用A(:) ),如图:


例3:

x=randperm(50,24)

y1=reshape(x,[4,6]

y2=reshape(x,[3,4,2]

x =

37    16    50    21     9    19    45    34    40    14    47    44    36    17    18    27    11    42    15     3    41    22     8    12

y1 =

    37     9    40     36    11    41

    16    19    14    17    42    22

    50    45    47    18    15     8

    21    34    44    27     3     12


y2(:,:,1) =

    37    21    45    14

    16     9     34    47

    50    19    40    44


y2(:,:,2) =

    36    27    15    22

    17    11     3     8

    18    42    41    12


例4:快速生成按行递增二维数组


A=resh



ape(1:100,10,10)'



3.6 复制和平铺数组 repmat( )

B = repmat(A,n,m) 返回一个数组,该数组在其维度包含 A 的 n 个副本,

维度包含 A 的 m个副本。

A = [ 1 , 2 , 3 ; 4 , 5 , 6 ]

B1 = repmat(A,2,3)         

B2 = repmat(A,1,1,2)

A =

     1     2     3

     4     5     6

B1 =

     1     2     3     1     2     3     1     2     3

     4     5     6     4     5     6     4     5     6

     1     2     3     1     2     3     1     2     3

     4     5     6     4     5     6     4     5     6

B2(:,:,1) =

     1     2     3

     4     5     6

B2(:,:,2) =

     1     2     3

     4     5     6



3.7 Matlab对矩阵进行旋转、左右上下翻转

  1. END

       rot90( ):旋转矩阵

B=rot90(A)       % 对矩阵A进行逆时针旋转,旋转角度为90度

B=rot90(A,n)    %逆时针旋转n*90度

  1. >> x=reshape( randperm(16) , 4 , 4 )

  2. x =

  3.      4     3      9     11

  4.      6     7    10     12

  5.      1    14    13    16

  6.      2     8     15      5




  7. >> y1=rot90(x)      %时针旋转90度

  8. y1 =

  9.     11    12    16     5

  10.      9    10    13    15

  11.      3      7    14      8

  12.      4      6      1      2



  13. >> y2=rot90(x,-1)   %时针旋转90度

  14. y2 =

  15.      2      1     6       4

  16.      8    14     7       3

  17.     15    13    10     9

  18.      5    16    12    11


  19. >> y3=rot90(x,2)     %逆时针旋转180度

  20. y3 =

  21.      5    15      8      2

  22.     16    13    14     1

  23.     12    10     7      6

  24.     11     9      3      4



  25. >> y4=rot90( rot90(x) )     %嵌套法实现逆时针旋转180度

  26. y4 =

  27.      5    15      8      2

  28.     16    13    14     1

  29.     12    10     7      6

  30.     11     9      3      4

  31. END


  (3)左右、上下翻转

fliplr()函数为矩阵左右翻转函数,具体操作为

B=fliplr(A)

例:


  1. flipud()函数为矩阵上下翻转函数,具体操作为

    B=flipud(A)

    例:

    END

      



例:字符串的反向输出

已知  str1='I LOVE MATLAB' 

编写代码反向输出该字符串,既输出str2='BALTAM EVOL I';

方法1:

str1='I LOVE MATLAB' 

str2=str1( [end:-1:1)    %对str1进行逆向索引


方法2:

str1='I LOVE MATLAB' 

N=length(str1)              %利用length()函数得到str1的长度

str2=str1( [N:-1:1)   %对str1进行逆向索引


方法3:

str1='I LOVE MATLAB' 
str2 = fliplr(str1)



3.8数组元素的循环移位

创建脚本文件并在其中键入以下代码 -

a = [1 2 3; 4 5 6; 7 8 9]  % the original array a
b = circshift(a,1)            %  circular shift first dimension values down by 1.
c = circshift(a,[1 -1])      % circular shift first dimension values %down by 1 
                                      % and second dimension values to the left % by 1

运行文件文件时,显示以下结果 -

a =
     1     2     3
     4     5     6
     7     8     9

b =
     7     8     9
     1     2     3
     4     5     6

c =
     8     9     7
     2     3     1
     5     6     4


3.9  median( )  数组的中位数

(1)M = median(A)返回 A 的中位数值。

如果 A 为向量,则 median(A) 返回 A 的中位数值。

如果 A 为非空矩阵,则 median(A) 将 A 的各列视为向量,并返回中位数值的行向量。

如果 A 为 0×0 空矩阵,median(A) 返回 NaN。

如果 A 为多维数组,则 median(A) 将沿大小不等于 1 的第一个数组维度的值视为向量。此维度的大小将变为 1,而所有其他维度的大小保持不变。

median 本身在 A 的数值类中计算,例如 class(M) = class(A)。

(2)M = median(A,'all'):

计算 A 的所有元素的中位数。


(3)M = median(A,dim)

返回维度 dim 上元素的中位数。例如,如果 A 为矩阵,则 median(A,2) 是包含每一的中位数值的列向量。

(4)M = median(A,vecdim) 

计算向量 vecdim 所指定的维度上的中位数。例如,如果 A 是矩阵,则 median(A,[1 2]) 是 A 中所有元素的中位数,因为矩阵的每个元素都包含在由维度 1 和 2 定义的数组切片中。


3.10  mean( ) 数组的均值

(1)M = mean(A) 

返回 A 沿大小不等于 1 的第一个数组维度的元素的均值。

如果 A 是向量,则 mean(A) 返回元素均值。

如果 A 为矩阵,那么 mean(A) 返回包含每列均值的行向量。

如果 A 是多维数组,则 mean(A) 沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。此维度会变为 1,而所有其他维度的大小保持不变。

(2)M = mean(A,'all') 计算 A 的所有元素的均值。

(3)M = mean(A,dim) 

返回维度 dim 上的均值。例如,如果 A 为矩阵,则 mean(A,2) 是包含每一行均值的列向量。

(4)M = mean(A,vecdim) 

计算向量 vecdim 所指定的维度上的均值。例如,如果 A 是矩阵,则 mean(A,[1 2]) 是 A 中所有元素的均值,因为矩阵的每个元素都包含在由维度 1 和 2 定义的数组切片中。


综合实例:中位数与均值的区别


%数组时=======

>>  x=[1.1,1.2,1.3,1.4,1.5,3,12,50,99]

x =

    1.1000    1.2000    1.3000    1.4000    1.5000    3.0000   12.0000   50.0000   99.0000

>> y1=median(x)  %中位数

y1 =

    1.5000

>> y2=mean(x)     %均值

y2 =

   18.9444



%矩阵时=======

a=randi(100,9,5)'

md1=median(a) 

md2=median(a,2) 

md_all=median(a,'all') 

me1=mean(a)

me2=mean(a,2)

me_all=mean(a,'all') 

运行上面代码:


a =

     8     24    13    19    24    42     5     91    95

    50    49    34    91    37    12    79    39    25

    41    10    14    95    96    58     6     24    36

    83     2      5     17    65    74    65    46    55

    30    75    19    69    19    37    63    79     9


md1 =

    41    24    14    69    37    42    63    46    36


md2 =

    24

    39

    36

    55

    37


md_all =

    37


me1 =

   42.4000   32.0000   17.0000   58.2000   48.2000   44.6000   43.6000   55.8000   44.0000


me2 =

   35.6667

   46.2222

   42.2222

   45.7778

   44.4444


me_all =

   42.8667



3.11 diag()函数

diag():创建对角矩阵或获取矩阵的对角元素全页折叠

语法

D = diag(v)

D = diag(v,k)

x = diag(A)

x = diag(A,k)


D = diag(v)    返回主对角线为向量 v 的对角矩阵。

D = diag(v,k) 将向量 v 的元素放置在第 k 条对角线上。k=0 表示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。

x = diag(A)    返回 由 矩阵 A 的主对角线元素组成的向量。

x = diag(A,k) 返回 由 矩阵 A 的第 k 条对角线上元素组成的向量。



(1)使用 diag 创建一个包含 向量v 在主对角线上的元素的矩阵。

创建一个 1×5 的向量。

v = [2 1 -1 -2 -5];

D = diag(v)

D = 5×5

     2     0     0     0     0

     0     1     0     0     0

     0     0    -1     0     0

     0     0     0    -2     0

     0     0     0     0    -5



(2)创建一个包含 向量 v 在第一个上对角线 (k=1) 上的元素的矩阵。

D1 = diag(v,1)

D1 = 6×6

     0     2     0     0     0     0

     0     0     1     0     0     0

     0     0     0    -1     0     0

     0     0     0     0    -2     0

     0     0     0     0     0    -5

     0     0     0     0     0     0


结果为一个 6×6 矩阵。将一个长度为 n 的向量指定为输入时,diag 返回一个大小为 n+abs(k) 的方阵。


(3)获取矩阵的对角线元素

获取一个随机 6×6 矩阵的主对角线上的元素。

A = randi(10,6)

A = 6×6

     9      3     10     8      7     8

    10     6      5     10     8     1

     2     10     9      7      8     3

    10    10     2      1      4     1

     7      2      5      9      7     1

     1     10    10    10     2     9


x = diag(A)

x = 6×1

     9

     6

     9

     1

     7

     9


(4)获取矩阵 A 的第一个下对角线 (k=-1) 上的元素。

结果比主对角线少一个元素。


x1 = diag(A,-1)

x1 = 5×1

    10

    10

     2

     9

     2


(5)调用 diag 两次将返回一个包含原始矩阵的对角元素的对角矩阵。

A1 = diag(diag(A))

A1 = 6×6

     9     0     0     0     0     0

     0     6     0     0     0     0

     0     0     9     0     0     0

     0     0     0     1     0     0

     0     0     0     0     7     0

     0     0     0     0     0     9




练习:生产7×7的魔方矩阵a,求矩阵a的每行的平均值和中位数,求矩阵a的每行的和/每列的和/两条对角线的和。

a=magic(7)

m1=mean(a,2)

m2=median(a,2)

s1=sum(a)

s2=sum(a,2)

v1=diag(a)

v2=diag(rot90(a))

s_v1=sum(v1)

s_v2=sum(v2)



练习:创建一个3×3魔方阵和3×3的随机矩阵,将两个矩阵拼接起来。然后提取任意元素。

clear;

clc;

mat1 = magic(3)

mat2 = rand(3,3)

mat3 = [mat1,mat2]         %横向拼接

mat4 = [mat1;mat2]         %纵向拼接

mat5 = mat3(2:3,[1,3,4])   %提取第2、3行,第1、3、4列的元素

mat6 = mat3([1,3],[2,4])




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

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


作业1:编程实现把任何一个输入的2*2的矩阵a变成10*10的矩阵y

要求效果如下:

提示,有两种方法。

方法1:采用repmat函数;

方法2:采用如下索引方式




作业2:

(1)先把A和B按纵向合成为一个6*3的矩阵C,然后再把C的3个列向量串接成一个18*1的列向量D,然后把D再变为一个1*18的行向量E。

(2)把上一步得到的行向量E,采用reshape函数变形为一个2*9的新矩阵F;

(3)采用cat()函数把A和B合并成一个3*3*2的三维数组G。


作业3:(1)创建一个5*10*3的随机整数三维数组,要求所有元素都是1-150之间的整数,且不许重复(提示:使用randperm函数;(2)先求每一面中的最大值最小值,再求整个矩阵的最大值和最小值


作业4:(1)创建5*10的符合正态分布(均值为0)的随机矩阵a。(2)分别对a矩阵的方向进行升序排序得到矩阵B,再对B矩阵的列方向降序排序得到矩阵C。(3)求这个C矩阵所有元素之和,以及元素的平均值。


作业5:(1)创建5*5的魔方矩阵a ;(2)对矩阵a先进行时针90°的旋转,再上下翻转后得到矩阵b;(3)验证得到的这个新矩阵b的,各行之和,列之和,左对角线之和(提示:需要把对角线元素一个个都索引出来,作为一个行向量,再来求和),右对角线之和,看看这些和是否相等?


作业6:生成一个400*400像素的纯色图(颜色调节到自己喜欢的状态)。提示,采用ones()/cat() 等函数生成400*400*3的三维数组,作为RGB三个通道的数据,然后用imshow()函数显示这个数组。







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


本节重要函数总结:




随机数函数课外扩展:

(1)

unifrnd (a,b); 产生一个[a,b]的均匀随机数;unifrnduniform random的缩写。

unifrnd (a, b, m, n); 产生m*n阶[a, b]均匀分布;

(2)

binornd(n,p,[M,N,P,…]) 产生的是服从二项分布的随机数,二项分布的参数为:n和p,

考虑一个打靶的例子,每枪命中率为p,共射击N枪,那么一共击中的次数就服从参数为(N,p)的二项分布。其中p要小于等于1且非负,N要为整数;;

binornd(n,p,[M,N,P,…]) 生成的随机数服从参数为(N,p)的二项分布,这些随机数排列成MNP… 阶矩阵。如果只写M,则生成M*M矩阵;


(3)

exprnd (mu ,m, n)产生m*n阶期望值为mu的指数分布的随机数矩阵;

exprnd 是 expectation random的缩写。



常见分布的随机数产生

函数名

调用形式

注 释

Unifrnd

unifrnd ( A,B,m,n)

[A,B]上均匀分布(连续) 随机数

Unidrnd

unidrnd(N,m,n)

均匀分布(离散)随机数

Exprnd

exprnd(Lambda,m,n)

参数为Lambda的指数分布随机数

Normrnd

normrnd(MU,SIGMA,m,n)

参数为MU,SIGMA的正态分布随机数

chi2rnd

chi2rnd(N,m,n)

自由度为N的卡方分布随机数

Trnd

trnd(N,m,n)

自由度为N的t分布随机数

Frnd

frnd(N1, N2,m,n)

第一自由度为N1,第二自由度为N2的F分布随机数

gamrnd

gamrnd(A, B,m,n)

参数为A, B的clip_image002分布随机数

betarnd

betarnd(A, B,m,n)

参数为A, B的clip_image004分布随机数

lognrnd

lognrnd(MU, SIGMA,m,n)

参数为MU, SIGMA的对数正态分布随机数

nbinrnd

nbinrnd(R, P,m,n)

参数为R,P的负二项式分布随机数

ncfrnd

ncfrnd(N1, N2, delta,m,n)

参数为N1,N2,delta的非中心F分布随机数

nctrnd

nctrnd(N, delta,m,n)

参数为N,delta的非中心t分布随机数

ncx2rnd

ncx2rnd(N, delta,m,n)

参数为N,delta的非中心卡方分布随机数

raylrnd

raylrnd(B,m,n)

参数为B的瑞利分布随机数

weibrnd

weibrnd(A, B,m,n)

参数为A, B的韦伯分布随机数

binornd

binornd(N,P,m,n)

参数为N, p的二项分布随机数

geornd

geornd(P,m,n)

参数为 p的几何分布随机数

hygernd

hygernd(M,K,N,m,n)

参数为 M,K,N的超几何分布随机数

Poissrnd

poissrnd(Lambda,m,n)

参数为Lambda的泊松分布随机数