通信系统仿真

崔春雷

目录

  • 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中的逻辑运算


运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。 MATLAB主要用于整个矩阵和阵列的操作。因此,MATLAB中的运算符既可用于标量数据也可用于非标量数据。MATLAB允许以下类型的基本操作 

  • 算术运算符

  • 关系运算符

  • 逻辑运算符

  • 按位运算符

  • 集合运算符

                               MATLAB中运算优先级排列


1、算术运算

MATLAB允许两种不同类型的算术运算 -

  • 矩阵算术运算

  • 数组算术运算

矩阵算术运算与线性代数中定义的相同。在一维和多维数组中,逐个元素执行数组运算。
矩阵运算符和数组运算符由句点符号(
.)区分。 然而,由于对于矩阵和阵列的加减运算是相同的,因此对于这两种情况,运算符相同。



下表为常用的四则运算符详解:                                                   

运算符描述说明
+加法或一元加法运算。A + B表示相加存储在变量A和B中的值。A和B必须具有相同的大小,除非是标量。 标量可以添加到任何大小的矩阵。
-减法或一元减法运算。 A-B表示从A中减去B的值。A和B必须具有相同的大小,除非是标量。可以从任何大小的矩阵中减去标量。
*矩阵乘法。 C = A * B是矩阵A和B的线性代数乘积。更准确地说,执行公式:
             
 ,对于非标量A和B,A的列数必须等于B的行数。标量可以乘以任何大小的矩阵。
 
.*阵列乘法。 A .* B是数组A和B的逐个元素乘积。A和B必须具有相同的大小,除非它们之一是标量。
/数组乘法。A .* B是数组A和B的逐个元素乘积。A和B必须具有相同的大小,除非它们之一是标量。
./数组右除。A./B是具有元素A(i,j)/  B(i,j)的矩阵。 A和B必须具有相同的大小,除非它们之一是标量。
\反斜杠或数组左除。如果A是一个方阵,A   B与inv(A)* B大致相同,除了以不同的方式计算。如果A是n×n矩阵,B是具有n个分量的列向量或具有若干这样的列的矩阵,则X = A  B是方程AX = B的解。如果A是不规则或几乎单数,将显示警告消息。
.\阵列左除。A . B是具有元素B(i,j)/  A(i,j)的矩阵。A和B必须具有相同的大小,除非它们之一是标量。
^矩阵 X ^ p是X的P次幂,如果p是标量。 如果p是整数,则通过重复平方来计算幂值。 如果整数为负,则X首先倒置。 对于p的其他值,计算涉及特征值和特征向量,使得如果[V,D] = eig(X),则X ^ p = V * D. ^ p / V。
.^阵列幂值, A ^ B是B(i,j)到A(i,j)的幂矩阵。A和B必须具有相同的大小,除非它们之一是标量。
'矩阵转置。 '是A的线性代数转置。对于复数矩阵,这是复共轭转置。
.'数组转置。.'是A的数组转置。对于复数矩阵,这不涉及共轭。


1)加减运算

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

B=[5,6 ; 7,8];

x1=A+B

x2=A-B



x1 =

     6     8

    10    12


x2 =

    -4    -4

    -4    -4


2)乘法

A=[ 2     5     7

       1     3     6

       3     2     5 ];

     

B=[  1     3     5

        2     4     6

        5     6     7 ];

c1=A*B       %矩阵相乘必须有A为[m,n],B为[n,p]矩阵,即为A的列数需要和B的行数相等.

c2=B*A

c3=A.*B


c1 =

    47    68    89

    37    51    65

    32    47    62


c2 =

    20    24    50

    26    34    68

    37    57   106


c3 =

     2    15    35

     2    12    36

    15    12    35



3)除法

%矩阵的除法分为左除和右除,

% A\B=inv(A)*B

% B/A = B*inv(A)



a=[ 11   5    3; 

      78   5    21; 

       7    15   9  ];

b=[ 20  30  40;

       30  40  50 ; 

       40  50  60 ];

c1=a\b

c2=b/a

c3=b./a

d1=inv(a)*b

d2=b*inv(a)

%比较c1,d1和c2,d2,既可以看到是否相等.


c1 =

    0.7692    1.5385    2.3077

    3.6923    5.7179    7.7436

   -2.3077   -5.1709   -8.0342


c2 =

   -9.9786    1.2222    4.9188

  -11.3034    1.4444    5.9530

  -12.6282    1.6667    6.9872

  

c3 =

    1.8182    6.0000   13.3333

    0.3846    8.0000    2.3810

    5.7143    3.3333    6.6667


d1 =

    0.7692    1.5385    2.3077

    3.6923    5.7179    7.7436

   -2.3077   -5.1709   -8.0342


d2 =

   -9.9786    1.2222    4.9188

  -11.3034    1.4444    5.9530

  -12.6282    1.6667    6.9872


4)矩阵的乘方

%乘方的要求为:A^x,其中A为方阵,x为标量.

A=[3 0 7; 9 12 8; 1 5 3];

result = A^3    %A为方阵,x为标量.


result =

         405         630         518

        2268        3123        3022

         884        1180        1125


5)点运算

% 点运算分为:    .*   ,   ./   ,   .   ,    .^

%【两个矩阵进行点运算】是指对应元素进行运算。

%A.*B 指的是对应元素相乘.

%A./B 表示对应元素相除

%A.^B表示对应元素做乘方运算.

%【要求】两矩阵具有相同的维数。


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

B = [9 10 7 ; 6 9 4 ; 2 5 8]

C=A.*B            % A.*B 指的是对应元素相乘.


% A./B == B.A

C1=A./B           %A./B 表示对应元素相除

C2=B.A


x=[2 2 2 ]

y=[1 2 3 ]

z=x.^y            %x.^y表示对应元素做乘方运算.



A =

     1     3     5

     2     4     6

     3     6     9

B =

     9    10     7

     6     9     4

     2     5     8


C =

     9    30    35

    12    36    24

     6    30    72


C1 =

    0.1111    0.3000    0.7143

    0.3333    0.4444    1.5000

    1.5000    1.2000    1.1250


C2 =

    0.1111    0.3000    0.7143

    0.3333    0.4444    1.5000

    1.5000    1.2000    1.1250


x =

     2     2     2


y =

     1     2     3


z =

     2     4     8



例 :当x=1,3,5,7,9时,分别求y=x^2*cos(x)的值.

x=1:2:9

y=x.^2.*cos(x)


x =

     1     3     5     7     9

y =

    0.5403   -8.9099    7.0916   36.9412  -73.8016





2、逻辑运算

真或假(布尔)条件logical数据类型分别使用数字 1和 0代表 true或 false 状态

某些 MATLAB函数和运算符返回逻辑值以指示是否满足某个条件。可以使用这些逻辑值作为数组索引或执行条件代码。

                                           

&“与”逻辑 AND
~“非”逻辑 NOT
|“或”逻辑 OR
xor异或逻辑 xor
all确定所有的数组元素是为非零还是 true
any确定任何数组元素是否为非零
FALSE逻辑 0(假)
find查找非零元素的索引和值
islogical确定输入是否为逻辑数组
logical将数值转换为逻辑值
TRUE逻辑值 1(真)

1)逻辑数据的生成

例:true、false来生成逻辑数据
x1=true
x2=[true,true,false,false]
x3=true(1,5)
x4=false(2,3)




例:使用函数logical( ) 把数值型数据转换为逻辑型数据,
     注意:logical( ) 函数的转换规则是 “非零数字转为逻辑1,数字0转换成逻辑0”

A=[ 0 0 1;
     
2 0 0;
     0
3 0];
B=
logical(A)    %将矩阵A转换成逻辑矩阵B
C=true(3)       %生成3阶逻辑真矩阵
D=false(3)      %生成3阶逻辑假矩阵




2)基本逻辑运算——与或非&,|,~)运算

例:






3)异或运算xor

异或的数学符号为“⊕”,其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b),在MATLAB中采用xor来实现。

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。


>> x=[1   0   0   1   0   1   0];

>> y=[1   0   1   0   1   1   1];

>> z=xor(x,y)

z =

           1×7 logical 数组

            0   0   1   1   1   0   1


也可以使用函数“and( )、or( ) not(  )xor( )”进行逻辑与或非等运算,如:

x1=logical([1 0 1 0])

x2=logical([1 1 1 0])

and(x1,x2)   %函数and(a,b),表示把a和b进行与运算

or(x1,x2)      %函数or(a,b),表示把a和b进行或运算

not(x2)        %函数not(a),表示把a取反

xor(x1,x2)    %函数xor(a,b),表示把a和b进行异或运算

运行结果:




4)逻辑索引

注意:采用逻辑索引时,逻辑数组的size要和被索引的数组的size一致。

例:数组的逻辑索引




例,矩阵的逻辑索引-1:

练习:把magic(5)矩阵的十字架上的元素索引出来。
x=magic(5)
y=[ 0 0 1 0 0 ;
     0 0 1 0 0;
     1 1 1 1 1;
     0 0 1 0 0;
     0 0 1 0 0];
y=logical(y)
z=x(y)'


例:给定任意一个随机数组,如何把奇数位置的元素索引出来?


上述代码的改进型:

clear


x=randn(1,100)


y1=[1 0]

y2=repmat(y1,1,50)

y3=logical(y2)


x(y3)



课堂练习:对数组 x=randn(1,100) ,从第1个元素开始往后数,每数6个元素作为一组,索引出第一个,把这些索引出来的元素组成数组z,并求数组z所有元素之和。要求:使用两种方法来做,分别用普通的下标索引法,以及逻辑索引法

%方法1 下标法

x=randn(1,100)

y=1:6:100

z=x(y)

sum(z)



%方法2 逻辑索引法

x=randn(1,100)

a=[1 0 0 0 0 0];

b=[1 0 0 0];

y1=repmat(a,1,16)

y2=[y1 , b]

y3=logical(y2)

z=x(y3)

sum(z)






3、关系运算

关系运算符比较两个数组中的元素,关系运算符也可以用于标量和非标量数据。数组的关系运算符在两个数组之间执行逐个元素的比较,并返回相同大小的逻辑数组,如果为真,则元素设置为逻辑1(true),如果为假,则元素设置为逻辑0(false)

                                  

==确定相等性
>=确定大于或等于
确定大于
<=确定小于等于
确定小于
~=确定不相等性
isequal确定数组相等性
isequaln测试数组相等性,将 NaN 值视为相等


例:两个元素之间的关系运算:




例: 两个矩阵之间的关系运算(运算时,两个矩阵内对应元素之间做运算

a=[1 2 ; 3 4]
b=[1 3 ; 2 4]
c1 = a>b  %矩阵对应元素比较
c2 = a==b
c3 = a~=b
c4 = a<b
c5 = a<=b
c6 = a>=b
d  = a(c2)  %取出a中和b相等的元素.



例:数组/矩阵 和单个元素的比较



例:

>> str1='aabcdaxa'

str1 =

    'aabcdaxa'

>> 'a'==str1                    %相当于用字符'a'去和str1中的每一个字符进行比较。

ans =

  1×8 logical 数组

   1   1   0   0   0   1   0   1

>> str1('a'==str1)='@'     %所有逻辑1的位置被选中,然后用字符'@'替换。

str1 =

    '@@bcd@x@'


例:



A = [0    -1    4

       9   -14   25

      -34  49   64];

B = A < 0      %返回一个零一矩阵,数组A中元素小于0的对应位置为1

A(B) =0     %将数组B指定位置值置为0


运行上述代码:

B =

  3×3 logical 数组

   0       1      0

   0       1      0

   1       0      0

A =

     0     0      4

     9     0     25

     0    49    64


注意:使用==对两个数字进行比较时,如果使用double类型,则当两个数字不同但又非常接近时(如小数点前15位一致,而第16位开始不一样),系统会认为两者相等。如以下代码:

x1=1.01

y1=1.0100000000000001

z1=(x1==y1)      %返回逻辑1,因为差距过小,认为两者相等。



x2=1.01

y2=1.010000000000001

z2=(x2==y2)       %返回逻辑0,认为两者不相等。

           所以,使用“==”运算时,使用int类型可以避免上述错误。



课堂练习1:对随机矩阵a=randn(10,10),如何计算矩阵a中处于-1到+1之间的元素总数目?


课堂练习2: 模拟50个同学某门课的期末成绩(随机分布在30-100之间),找出不及格的人数,以及占班级总人数的百分比。再把50-59分的分数置为60。


4、按位运算

按位运算符对位执行,并执行逐位运算。|^的真值表如下 -





假设 A = 60 和 B = 13 ;  现在以二进制格式,它们将如下所示:

A    =   0011 1100
B    =   0000 1101
%-------------------

A&B = 0000 1100

A|B =   0011 1101

A^B =  0011 0001

~A  =   1100 0011

MATLAB提供了诸如“按位与”和“按位或”以及“按位非”操作,移位操作等位操作的各种功能。下表显示了常用的按位操作:

方法目的
bitand(a, b)整数ab的位与AND操作
bitcmp(a)a的比特补码
bitget(a,pos)在整数数组a中,获取指定的位置pos位字节
bitor(a, b)整数a和b的逐位OR操作
bitset(a, pos)设置在指定pos处的位字节
bitshift(a, k)返回向左移位k字节,相当于乘以2^k。 k
的负值对应于向右移位或除以` 2^
` 并舍入到最接近的整数到负无穷大。任何溢出位都被截断。
bitxor(a, b)整数ab的逐字节位XOR操作
swapbytes交换字节排序


&&和|| 与 &和| 的区别?

单个&符是逻辑AND运算符。双&符&&还是一个逻辑AND运算符,采用短路行为。短路仅表示仅当第一个操作数(左侧)未完全确定结果时才评估第二个操作数(右侧)

&是逻辑AND运算符,&&是短路AND运算符。它们在操作数的求值方式以及是否对数组或标量进行操作方面有所不同:&(AND运算符)和|(OR运算符)可以按元素方式对数组进行运算。与其他语言类似,&是逻辑按位运算符,&&而是逻辑运算。

&&和||是短路版本,仅当结果未完全由第一个操作数确定时才评估第二个操作数。它们只能在标量上运行,而不能在数组上运行。

对于&&,仅当左操作数为true时才计算右操作数,并且结果是单个布尔值。如:x = (b ~= 0) && (a/b > 18.5)




5、集合运算

MATLAB为集合操作提供了各种功能,如联合,交集和集合成员的测试等。

函数描述
intersect(A,B)设置两个阵列的交集; 也就是返回A和B
共同的值。返回的值按排序顺序排列。
intersect(A,B,’rows’)将A的每一行和B的每一行视为单个实体,并返回A
和B两者共同的行。返回矩阵的行按排序顺序排列。
ismember(A,B)返回与A相同大小的数组,其中包含1(true),其中A的元素位于B中。其他地方返回0(false)。
ismember(A,B,’rows’)将A的每行和B的每一行视为单个实体,并返回一个包含1(true)的向量,其中矩阵A的行也是B
行。其他返回0(false)。
issorted(A)如果A的元素按排序顺序返回逻辑1(真),否则返回逻辑0
(假)。输入A可以是一个向量,也可以是N-by-1
或1-by-N的字符串数组。 如果A和sort(A)
的输出相等,则认为A被排序。
issorted(A, ‘rows’)如果二维矩阵A的行按排序顺序返回逻辑1(真),否则返回逻辑0(假)。 如果A和排序(A)的输出相等,则认为矩阵A被排序。
setdiff(A,B)设置两个数组的差异; 返回A中不在B中的值。返回的数组中的值按排序顺序排列。
setdiff(A,B,’rows’)将A的每一行和B的每一行视为单个实体,并从不在B中的A返回行。返回的矩阵的行按排序顺序排列。'rows'选项不支持单元格数组。
setxor设置两个数组的异或
union设置两个数组的并集
unique使数组中的值唯一

例:

A = [7 1 7 7 4]; 
B = [7 0 4 4 0];
C = intersect(A,B)
C = 1×2
    4     7


A = [3 6 2 1 5 1 1];
B = [2 4 6 8];
C =
setdiff(A,B)   %相当于A-B
C = 1×3
    1     3     5



A = [5 7 1 7]; 
B = [3 1 1 5];
C = union(A,B)
C = 1×4
    1     3     5     7


A = [9 2 9 5 2 5];
C = unique(A)
C = 1×3
    2     5     9



6、排列组合运算

(1)组合函数:nchoosek()   顾名思义,从n中选择k个

MATLAB函数中用nchoosek 来实现二项式系数或所有组合

语法:

C = nchoosek(n,k)

C = nchoosek(v,k)

描述:

C = nchoosek(n,k) 其中n和k是非负整数, 返回 n!/((n–k)! k!).
这是从n种情况中一次取出k种的组合的数量。

比如,从全班30个同学里抽出10个同学参加某个活动,有多少种选法?

>> nchoosek(30,10) 

ans =

    30045015


C = nchoosek(
v,k), 其中v是一个长度为n的行向量,创建一个矩阵,该矩阵的行由每次从v中的n个元素取出k个取值的所有可能组合构成。
矩阵 C 包含 n!/((n–k)! k!) 行和 k 列.
输入 n, k, 和 
v 支持类型:float double 和 float single.
例子:

>> v=[1  3  5  7  9];

>> y=nchoosek(v,3)

y =

     1     3     5

     1     3     7

     1     3     9

     1     5     7

     1     5     9

     1     7     9

     3     5     7

     3     5     9

     3     7     9

     5     7     9


>> v2='abcd';

>> y2=nchoosek(v2,3)

y2 =

  4×3 char 数组

    'abc'

    'abd'

    'acd'

    'bcd'


(2)排列函数: perms()

P = perms(v)返回的矩阵包含了向量 v中元素按字典顺序反序的所有排列。P的每一行包含 v中 n 个元素的一个不同排列。矩阵 P具有与 v相同的数据类型,包含 n! 行和 n 列。


>> v=[1  3  0  -2];

>> y=perms(v)

y =

    -2     0     3     1

    -2     0     1     3

    -2     3     0     1

    -2     3     1     0

    -2     1     0     3

    -2     1     3     0

     0    -2     3     1

     0    -2     1     3

     0     3    -2     1

     0     3     1    -2

     0     1    -2     3

     0     1     3    -2

     3    -2     0     1

     3    -2     1     0

     3     0    -2     1

     3     0     1    -2

     3     1    -2     0

     3     1     0    -2

     1    -2     0     3

     1    -2     3     0

     1     0    -2     3

     1     0     3    -2

     1     3    -2     0

     1     3     0    -2

>> whos y

  Name       Size            Bytes      Class       Attributes

  y              24x4            768        double      


其他逻辑操作运算:

1.all ,若向量的所有元素都非零,结果为1,否则为0

resultALL = all( [10 20 30 40 ] )  %均非零,结果为1.
resultALL =
           1

2.any ,若向量中有一个以上的元素非零,结果为1;只有所有元素都是0时结果才为0

resultANY = any([1 2 3 4 5 0])  %有元素非零,结果为1.
resultANY =
           1

3.exist 判断工作空间是否存在,存在为1,否则非零.

resultEXIST = exist('plot')
resultEXIST =
             5

4.find 找出向量或矩阵非零元素的位置

find函数:查询非零元素的位置和值

用法1:B = find(A),A是一个矩阵,查询(按列)非零元素的位置;
     如果A是一个行向量,则返回一个行向量,否则,返回一个列向量。
     如果A全是零元素或者空数组,则返回一个空数组。


>> A = [0  1   2   0   4   5]
A =
    0     1     2     0     4     5

>> B = find(A)
B =
    2     3     5     6

>> A = [0  1  2 ; 0  4  5]
A =
    0     1     2
    0     4     5

>> B = find(A)
B =

    3
    4
    5
    6

(位置的判定:在矩阵中,第一列开始,自上而下,依次为1,2,3...,
 然后再从第二列,第三列依次往后数)



用法2:B = find(A>2),找到A中比2大的元素的位置
>> A = [0  1  2 ; 0  4  5]
A =
    0     1     2
    0     4     5

>> B = find(A>2)
B =
    4
    6
   
用法3:B = find(A,2),找到A中最先出现的2个不为零的数的位置

>> A = [0  1  2 ; 0  4  5 ;  6  0  8]
A =
    0     1     2
    0     4     5
    6     0     8

>> B = find(A, 2)
B =
    3
    4

         
用法4:B = find(A,2, 'first'),找到A中最先出现的2个不为零的数的位置

     B = find(A,2, 'last'),找到A中最后出现的2个不为零的数的位置


>> A = [0  1  2 ;  0  4  5 ;  6  0  8]
A =
    0     1     2
    0     4     5
    6     0     8

>> B = find(A, 2, 'first')
B =
    3
    4

>> C = find(A,2,'last')
C =
    8
    9
   

用法5:[x, y] = find(A),找到A中非零元素所在的行和列,
      行存储在矩阵x中,列存储在矩阵y中




   
用法6:[x, y, v] = find(A),找到A中非零元素所在的行和列,
          行存储在矩阵x中,列存储在矩阵y中,值存储在矩阵v中
        (需要知道值的用此用法,其他用法只能确定位置)


5.isempty 判断矩阵是空矩阵 如果为空,则为1,非空0;

resultISEMPTY = isempty([1 2 3 ; 4 5 6 ; 7 8 9 ])   %矩阵显然非空,则为0
resultISEMPTY =
               0

6.isglobal 判断是否为全局变量,是为1,非为0

7.isinf 判断是否为无穷小量,是为1,否为0

8.isnan 若元素是nan,则为1,否为0

9.isfinite 若矩阵大小有限,则取1,否则则为0

10. issparse 判断是否为稀疏矩阵,是为1,否为0

11. ischar 判断变量是字符组,是为1,否则取0

12、isequal函数,确定两个数组是否相等。

基本语法:

tf = isequal(A,B)

tf = isequal(A1,A2,...,An)

如果 A 和 B 等效,则 tf = isequal(A,B) 返回逻辑值 1 (true);否则,返回逻辑值 0 (false)。

有关每种数据类型的等效性的定义,请参阅输入参数部分





13、isa()函数,确定输入是否具有指定数据类型

语法:tf = isa(A,dataType)  ; tf = isa(A,typeCategory)

说明:如果 A 具有 dataType 指定的数据类型,tf = isa(A,dataType) 将返回 1 (true)。

否则,将返回 0 (false)。输入参量 A 可以具有任何数据类型。

如果 A 是对象且 dataType 是 A 的类或 A 的超类,则 isa 返回 1。


示例:

创建数值变量并确定其数据类型是否为 double。

A = 3.1416;

tf = isa(A,'double')

tf = logical

   1


创建一个 32 位整数数组,并确定其数据类型是否为 int32。

A = int32([0 2 4 6 8])

A = 1x5 int32 row vector

   0   2   4   6   8


tf = isa(A,'int32')

tf = logical

   1


确定 A 的数据类型是否为 char。

tf = isa(A,'char')

tf = logical

   0


确定变量类型是否属于指定的类别

创建一个其数据类型为 uint8 的数组。确定该数组是否具有属于 integer 类别的数据类型。

A = uint8([0 2 4 6 8])

A = 1x5 uint8 row vector

   0   2   4   6   8


tf = isa(A,'integer')

tf = logical

   1




课后练习1:查看圆周率前10万位里面,是否包含自己的生日(如3月12日生日,则查看pi中是否有0312这个四个连续数字),如果有,返回自己生日处于小数点后面多少位?

>>  s=vpa(pi,50000);

s=char(s);

>> strfind(s,'0312')


课后练习2:异或运算的应用

一个数组包含 n-1 个成员,这些成员是 1 到 n 之间的整数,且没有重复,请找出缺少的那个数字。

最快的解答方法,就是把所有数组成员(A[0] 一直到 A[n-2])与 1 到 n 的整数全部放在一起,进行异或运算。

A[0] ^ A[1] ^ ... ^ A[n-2] ^ 1 ^ 2 ^ ... ^ n

上面这个式子中,每个数组成员都会出现两次,相同的值进行异或运算就会得到 0。只有缺少的那个数字出现一次,所以最后得到的就是这个值。

你可能想到了,加法也可以解这道题。

1 + 2 +  ... + n - A[0] - A[1] - ... - A[n-2]

但是,加法的速度没有异或运算快,而且需要额外的空间。如果数字比较大,还有溢出的可能。

下面是一道类似的题目,大家可以作为练习。

一个数组包含 n+1 个成员,这些成员是 1 到 n 之间的整数。只有一个成员出现了两次,其他成员都只出现一次,请找出重复出现的那个数字。


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


作业1:对随机矩阵a=randn(10,10),如何计算矩阵a中处于-1到+1之间的元素总数目?


作业2: 模拟50个同学某门课的期末成绩(随机分布在30-100之间),找出不及格的人数,以及占班级总人数的百分比。再把50-59分的分数置为60。


作业3:(1)采用随机函数randn()生成一个10*10的随机矩阵A,假设x为A中的任意一个元素,采用逻辑索引等方法找出A中所有满足:-1<x<-0.5,以及0.5<x<1的元素,把这些元素给y。

(2)求出数组y的元数的总数目。

(3)把A中满足(1)中要求的元素替换成0;


作业4:利用蒙特卡洛法计算圆周率

步骤:

(1)先用rand函数生成方形区域内的n个点的所有横坐标组成的数组x(1*n的数组),再生成这n个点的纵坐标组成的数组y1*n的数组并用plot(x,y,'*')画出这n个点的图像;

(2)计算所有的n个点和圆心的距离r(r也是一个1*n的数组);

(3)判断每个点的r与设定的圆的半径r0=1的大小逻辑关系,计算位于圆内的点数m。

(4)利用公式,计算pi的值。


提示:如何确定数组x=rand(1,20)中大于0.8的元素的个数,以及所有大于0.8的元素之和?

x=rand(1,20)

y=(x>0.8)         %大小关系的逻辑判断,得到一个1*20的逻辑数组

y_num=sum(y)  %求这个逻辑数组的和(所有1的和`),既为符号要求的点数

z=x(y)                %使用逻辑数组y索引出x中符合要求的元素,给z

z_num=sum(z)  %算出z中所有元素之和




作业5:设x=randi(10,3,10); y=randi([5,20],5,10);求x与y的交集、并集,并用unique()函数对x和y进行瘦身。










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



课外补充知识:

一、蒙特卡罗方法


蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。
如下图,正方形和圆的半径为1,在方形区域内随机撒下大量的随机点, 看下他们在区域中的分布状况。则根据面积公式,(落在圆内的种子数/总随机数*4)即为π的大小,如果随机种子数量足够多,并重复大量次的话,可以得到一个与实际比较接近的π值python入门学习之蒙特卡罗模拟之一

蒙特卡洛法的核心思想在于:

                         

  • 圆的面积: 

  • 方的面积: 

那么,圆在方里的概率为:


模拟方法

通过上述公式,转换得


其中,

  • m为圆内点的个数;

  • n为正方形内的总点数。

这里,需要检验某个点是否在圆内,可通过公式:来判别。

其中


所以,问题的关键在于判断有多少个点在圆内,既m的具体值是多少?

二、蒙特卡罗模拟

2.1. 程序定义

变量

  • m:整数,落入圆内的点的个数

  • n:整数,落中圆外的点的个数

  • x:浮点数,居于(0,1)区间的随机数

  • y:浮点数,居于(0,1)敬意的随机数

  • r:浮点数,圆半径

  • [公式] :浮点数,圆周率

算法

如果某一点(x, y),并且x,y分别在区间(0, 1)内,满足

则在圆内,否则在圆外。

重复试验n次,求得圆周率有:


  • 蒙特卡洛模拟:案例二,定积分求解

要求y = x^2在(0,1)的定积分,即求下图中阴影部分的面积。利用随机数可以解决这一问题,随机撒大量种子,看种子落在图中阴影部分的比例,即为阴影部分的面积,也是我们要求的定积分的结果。(当然我们通过求解原函数可以得到其结果为0.33333)

蒙特卡洛法模拟求解的结果为0.3313,还是比较接近的。






拓展:利用蒙特卡洛法求解下图中的阴影面积。










ind2sub 和 sub2ind 函数

ind2sub函数

ind2sub和sub2ind这对函数,是互逆的一对函数。

ind2sub把数组或者矩阵的线性索引转化为相应的下标;sub2ind则正好相反,

将下标转化为线性索引。


下标和索引之间可以通过 ind2sub 和 sub2ind 函数相互转换,具体可以看帮助

在命令行窗口中输入 help 函数名 按下回车键)


[I,J] = ind2sub(siz,IND)

IND = sub2ind(siz,I,J)


二维矩阵: IND = sub2ind(SIZ,I,J)

SIZ是转换矩阵的大小,一般用size函数求得;

I是下标中的行数,J是下标中的列数;

返回值IND是转化后对应的序列号(索引号);

还有使用A(:)就可以将数组A转换为列向量