通信系统仿真

崔春雷

目录

  • 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论坛常见问题200问:





Matlab向量化编程思想


一、Matlab简介

Matlab名字来源于“矩阵实验室”缩写,是美国MathWorks公司推出的一套以矩阵计算为基础的数学软件。它提供了丰富可靠的矩阵运算、图形绘制、数据处理等功能,可以实现数值分析、优化、统计、微分方程求解、信号处理、图像处理等的计算和图形显示,可解决工程、科学计算和数学学科中许多问题。因此,被广泛应用于自动控制、图像信号处理、生物医学工程、语音处理、信号分析、时间序列分析与建模、优化设计等领域。

Matlab功能强大、简单易学、编程效率高,几乎可以完成所有的数学建模的编程需要,是数学建模必备软件。






图1 Matlab 2015a操作界面






:设置当前路径,访问当前路径下的文件,只需相对路径即可;

Current
Folder:显示当前路径下的文件;

Command
Windows:命令窗口,一般用来调试逐段代码;

Workspace:工作空间,显示当前内存变量;

Command
History:命令历史窗口,可以选中部分代码,右键创建M-文件。






:打开代码编辑窗口,创建、编辑、运行M-文件。





二、基础语法

1.
变量

命名规则:字母开头,任意字母、数字、下划线的组合,尽量避免与Matlab自带名称冲突;

变量直接起名,赋值使用即可;

特殊变量:eps——浮点数 [公式] 的误差限;

pi——π

inf或Inf——正无穷大;

NaN——非数,例如洛必达法则的未定式;

i或j——虚数单位,故要尽量避免用i或j作为循环变量;

ans——存储未赋值的运算结果

syms x y——声明符号变量x, y

2.
基本函数

sin, cos, tan,
cot, asin, acos, atan——三角函数与反三角函数;

exp(x)——e

x

log2, log, log10——以2, e, 10为底的对数函数;

sqrt, abs——平方根,绝对值

floor, ceil,
fix, round——取整函数,分别是向负无穷、正无穷、向0取整和四舍五入

3.
基本格式与算符

format short/long/rat/hex——设置短浮点(4位小数)、长浮点(15位小数)、分数、十六进制显示

format short e——短浮点×10的幂次显示,如pi=3.1416e+00

+-*/^\——算术运算符:加、减、乘、除、乘幂、左除

== ~= < > <= >=——关系运算符:等于、不等于、小于、大于、小于等于、大于等于

& | ~——逻辑运算符:与、或、非

4.
学会使用帮助

help 或doc 函数名

二、Matlab向量化编程思想

Matlab是以向量、矩阵为基本元素的,所以要编写真正的Matlab程序必须抛弃“C语言那种单数值、元素化考虑问题”的思路,转以向量、矩阵为最小单位来考虑问题。也就是说,Matlab的编程思想是——向量化编程,即面向向量或矩阵。

这样做的好处,至少有两个:

(1) 代码大大简化,易编程、清晰可读性强;

(2) 执行效率也更高。

下面针对Matlab中常见的向量化处理问题方法,举例加以说明:

1. 整体操作“大块数据”

Matlab为同型的数据块(向量或矩阵)的整体做运算提供了“点运算”。

比如,A.*C 和 A./C 表示A与C的对应位置的各元素做 * 和 / 运算得到与它们同型的一个新矩阵。

例1 物理实验利用测得的电压电流具体数据,验证欧姆定律R=U/I.

代码1(C语言风格)

U = [0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];
I = [0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345];
L = length(U);
S = 0;
for k = 1:L
    R(k) = U(k)/I(k);   
   S = S + R(k);
end
R = S/L

运行结果:R = 30.5247

代码1’(Matlab风格)

U = [0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41];
I = [0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345];
R = U./I;
R = mean(R)

运行结果:R = 30.5247


2. 尽量把“C语言风格的循环”向量化实现

例2 计算1 + 1/3 + … + 1/99


代码2(C语言风格)

s = 0;
for k=1:2:99
s = s + 1/k;
end
s

运行结果:s = 2.9378


代码2’(Matlab风格)

k=1:2:99;
s = sum(1./k)

运行结果:s = 2.9378

注意:代码2’中,不要写成 “for k=1:2:99”, 否则k就是变化的一个数值而不是向量。

例3. 用间距为0.1的水平线和垂直线均匀分割x∈[-5,5]×[-2.5,2.5]的矩形域,在所有水平线和垂直线交点上计算函数z=sin|xy|的值,并图示。

(1)求出各网格点的函数值


代码3(C语言风格)

x=-5:0.1:5;
y=(-2.5:0.1:2.5)';
N=length(x);
M=length(y);
for ii=1:M
    for jj=1:N
        X0(ii,jj)=x(jj);
        Y0(ii,jj)=y(ii);
        Z0(ii,jj)=sin(abs(x(jj)*y(ii)));
    end
end

代码3’ (Matlab风格)

[X,Y]=meshgrid(-5:0.1:5, -2.5:0.1:2.5);     
Z=sin(abs(X.*Y));

(2) 画图

surf(X,Y,Z)  %画三维图形
xlabel('x')  %标记坐标轴
ylabel('y')
shading interp %用插值处理色彩
view([190,70]) %旋转一定角度观看图形

运行结果





3. 尽量使用Matlab现成的“矩阵操作语法、矩阵函数或工具箱”

Matlab提供了大量非常便捷的矩阵操作语法、矩阵函数、以及各种工具箱,优先使用它们来完成程序。

操作矩阵的函数,比如

[m n]=size(A)——返回矩阵A的“型”,m行n列

length(A)——返回行数或列数中最大的那个

mean(A)——返回A中所有元素平均值

sum(A)或sum(A,1)——返回A各列元素之和,各行之和用sum(A,2)

[Y I] = max(A)——Y=A各列元素的最大值; I=各列最大值所在行

sort(A)——矩阵各列按递增排序,递减排序加参数 ‘descend’

unique(A)——返回矩阵A中不重复的值(去掉重复元素)

等等………..这些函数已经实现了通常所需要的各种操作,所以完全没有必要再去按C语言的思路去自己重写代码。




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


2.矩阵运算技巧:

Matlab里面应该多用向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。

如,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:

方法一:利用布尔索引。

array(array>1)=0;  



%把大于1小于3的变成0。
array(and(array>1,array<3))=0;


方法二:find函数

array=rand(1,100);

[m n]=find(array>0.5);

array(n)=0;


%%

array=rand(1,100);

[mn]=find(array>0.5&array<0.7);

array(n)=0;


方法3: 重视eval函数的应用,可以方便的把string表达式转化为命令语句执行,而且是唯一可以同时申请多变量的函数语句:

for i=1:5

         string=strcat('a',num2str(i),'=','magic','(',num2str(i),')')

         eval_r([string])

end


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

3.MATLAB 里面加快程序运行速度的方法。

1. 向量化。养成看到for就浑身不舒服的本能反应。
2. 矩阵如果太大了会爆内存则千万别向量化,老老实实用循环吧。有些3-4纬的矩阵,用循环处理起来甚至快一些。
3. 循环竖着走比横着走快。
4. 不少内置函数都有大量的error check。直接用profiler找出真正干活的。
5. 不少内置函数在网上都有人提供了更快的版本的,当然功能弱一些,正好符合提速的需求。
6. 视情况,有时可以把变量强行变成single,速度暴增。
7. 利用copy on write的特点,丢进函数的变量能不对其修改就不要修改。
8. matlab就是个高级计算器,不要拿干来处理文件,往数据库里塞数据这种活。eval, object之类的东西能别碰就别碰,尽量保持着every is an array of double的模式。
9. 不要把代码全塞到一行。不但难看有时候还慢一些。



1. 循环向量化

2. 利用函数的矩阵输入功能批量处理

3. 必须用for且费时的地方改成单层parfor,要是循环次数比cpu核数还少反而会拖慢程序

4. 非常大的矩阵的运算可以用gpuArray(这个在matlab 深度学习工具箱中深有体会)

5. 能用矩阵不要用cell,速度慢且占内存巨多

6. 对调用频繁且费时的地方尝试生成c ,写成mex

7. 按编译器提示先初始化矩阵大小(但我大部分时候还是懒得预先算矩阵大小…)

8. Matlab 是可以多开的,如果parfor不能改或者懒得改可以“人肉parfor”,也就是把一个for拆成几段然后多开几个matlab 一起执行,最后再合并结果,比较暴力哈哈

9. 费时的程序最后加个email发送程序,跑完直接把结果发邮箱里


2.用句柄函数

搜索也很费事,所以多用句柄函数和内在函数
搜索速度如下:
句柄函数>内在函数>当前目录函数>其它目录函数

调用方法:
比如
ans=feval('@fun',传入变量1,....)

ans=fun(args)
运行速度快的多
编译的时候,句柄函数会直接把路径给内存了,不会执行全路径搜索



3.pre-allocation提高运算速度

虽然matlab是动态语言,但是【预先分配变量】可以明显提高运算速度。

例如:section1中预定义了A = zeros() ,比 section2 的运算速度快了近40倍。



4.arrayfun 函数

1. 关于向量化
   大家都知道,如果用一个函数对一个矩阵中的每一个元素进行求值,那么就要用到 .*, ./之类

function r = fmat(x)
   r = x.^2 + 1./x;
end

A = [1 2 3 4];
fmat(A)

   上面这样就可以做到用fmat对A每一个元素分别求值。但不是所有的函数都像fmat这样,下面这种情况就不行:

function r = fmat2(x)
if x > 0
   r = x.^2;
else
   r = 1./x;
end

fmat2(A)  
 % 会出错

   可以看到,因为上面fmat2 里面有判断语句,就不能把整个矩阵作为输入参数。我知道的解决方法有3种:

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

      值得说一说的是第二种和第三种。arrayfun只是比用for更加简洁,速度上没有太大差别。但是,用逻辑矩阵的话,就比前两种快10倍。逻辑矩阵是向量化的利器。比如 A>0 就会返回一个逻辑矩阵,里面全是1, 0 。并且, 逻辑矩阵可以当作索引, A(A>0) 就把所有A>0 的数返回。


5. 类型转换
matlab中一共有4种类型:func(函数句柄), num(数值), sym(符号), str(字符)
-  在数值运算中,使用func, num
-  需要输入输出出,要用到str
-  进行符号运算(符号微分,积分)时,用sym

我们使用matlab,一般有这么个过程:
- 先进行公式推导,这时要用sym, symfun类型
- 再进行数值计算,这里要用普通的func, 和num 类型
- 最后与GUI界面交互的时候,要用str类型
这里介绍几个用于转换的函数

str2func('@(x,y)sin(x*y)') %  str -> @func 返回一个函数句柄

syms x y
fs(x,y) = x^2+sin(x*y);
fh=matlabFunction(fs); % symfun -> @func 返回一个函数句柄 !!!强烈推荐

fh = @(x)x.^2+sin(x);
fun2str(fh)    % @func ->str 函数句柄变为字符


6. 三维画图
作图第一步,对 x, y 划分网格,用的是 meshgrid 。这样画出来的图在一个立方体的范围内,但是有时候我们要显示一个圆柱体内的三维图形这时候画网格可以用 cylinder

[x, y] = cylinder(linspace(0,10,100),200);
% linspace(0,10,100)指在半径[0, 10]上划分为100份,参数200指的是在圆周方向上 200等分

z = sin(x) + cos(y);
mesh(x, y, z);





7.如何在Matlab中使用等待栏?

想需要一段时间的操作准备一个等待栏?这是代码:

h = waitbar(0,'Please wait...');

for i=1:counterend
    waitbar(i/waitbarcounter)
    Atemp    = At+i*step;
    handle   = @(M) 1/M^2*((2/(gamma+1))*(1+(gamma-1)*M^2/2))^((gamma+1)/(gamma-1))-(Atemp/At)^2;
    Mach     = fzero(handle, 5);
    Aplot(i) =  Atemp/At;
    Tplot(i) = Tc / (1+(gamma-1)*Mach^2/2);
    Mplot(i) = Mach;
    plot(Aplot, Tplot)
end

close(h)


8. 如何设置程序错误断点?  

在程序开头 加上一句命令: dbstop if error

可以把这个命令写在主函数最开头,免得每次跑程序都要在命令窗口敲多麻烦

如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。再也不用设断点了。如果再配合两把宝剑,会更好用:dbup 和 dbdown这两个命令在程序错误并断点之后在命令行输入,用于在workspace间切换查看变量调试。dbup是跳到上层workspace,dbdown是返回。





bsxfun
强大的、万能的、不同维数的矩阵扩展混合运算,从此告别矩阵运算中的for循环
另,matlab里所有以fun为后缀的命令都很好用,arrayfun,cellfun,structfun,等等

@() 匿名函数
使用函数式编程,在编写以数学公式为主的程序中比传统编程方法好得多

set(gca,...)等
所有与画图相关的命令都包含了千奇百怪的属性和参数,非常实用,如著名的 set(gca,...)

$   $
画图中的标题、注释等文字内容是可以直接使用latex格式的,只须在包含latex命令的部分前后用$框起来即可

slice
高维切片,要在三维空间中表现三个以上变量的函数关系,必备此命令



9 巧用eval函数

1. eval
当处理海量数据,进行计算分析的时候,你就需要打开不同文件夹提取和保存数据。这种情况下,eval函数可以大大提高程序的灵活性。如下:input文件夹下有10个子文件夹a1,a2,...,a10,没个文件夹下都有3个mat文件:Press_l,X_l和Y_l。分别读取数据并对其进行处理,然后输出结果文件:XL_l和Patch_l。代码如下:

clear
clc
number=10;%文件数
%创建输出文件夹 C:\Z目录下output文件夹
system('mkdir C:\Z\output')
for i=1:number %打开不同文件夹下相同的数据
   eval(['load C:\Z\input\a',num2str(i),'\Press_l.mat']);
   eval(['load C:\Z\input\a',num2str(i),'\X_l.mat']);
   eval(['load C:\Z\input\a',num2str(i),'\Y_l.mat']);
   ...%计算过程 要输出结果 XL_l 和 Patch_l
   ...
   name=['mkdir C:\Z\output\a',num2str(i)];%在同一目录下生成输出文件
   system(name);%生成C:\Z\output目录下a*文件夹
   str1=['C:\Z\output\a',num2str(i),'\XL_l.mat'];
   str2=['C:\Z\output\a',num2str(i),'\Patch_l.mat'];
   eval(['save ',str1,' XL_l']);
   eval(['save ',str2,' Patch_l']);
end


可能有人要说了,我的文件夹名字不规律,怎么办。简单,将你的文件夹名字存到一个cell数组内,然后调用胞元就可以了。代码如下:

clear
clc
str={'a1','b2','c3','d4','e5'};
number=size(str,2);%文件数
%创建输出文件夹 C:\Z目录下output文件夹
system('mkdir C:\Z\output')
for i=1:number %打开不同文件夹下相同的数据
   eval(['load C:\Z\input\',str{1,i},'\Press_l.mat']);
   eval(['load C:\Z\input\',str{1,i},'\X_l.mat']);
   eval(['load C:\Z\input\',str{1,i},'\Y_l.mat']);
   ...%计算过程 要输出结果 XL_l 和 Patch_l
   ...
   name=['mkdir C:\Z\output\' str{1,i}];%在同一目录下生成输出文件
   system(name);%生成C:\Z\output目录下a*文件夹
   str1=['C:\Z\output\',str{1,i},'\XL_l.mat'];
   str2=['C:\Z\output\',str{1,i},'\Patch_l.mat'];
   eval(['save ',str1,' XL_l']);%输出XL_l
   eval(['save ',str2,' Patch_l']);%Patch_l
end


可能还有人说了,我的文件夹太多,不能一一列举出来怎么办?也好办,用dir函数读取目录下的所有文件夹的名字就可以了。代码如下:

clear
clc
filename=dir('C:\Z');
number=size(filename,1);%文件数
%创建输出文件夹 C:\Z目录下output文件夹
system('mkdir C:\Z\output')
for i=1:number %打开不同文件夹下相同的数据
   eval(['load C:\Z\input\',filename(i,1).name,'\Press_l.mat']);
   eval(['load C:\Z\input\',filename(i,1).name,'\X_l.mat']);
   eval(['load C:\Z\input\',filename(i,1).name,'\Y_l.mat']);
   ...%计算过程 要输出结果 XL_l 和 Patch_l
   ...
   name=['mkdir C:\Z\output\' filename(i,1).name];%在同一目录下生成输出文件
   system(name);%生成C:\Z\output目录下a*文件夹
   str1=['C:\Z\output\',filename(i,1).name,'\XL_l.mat'];
   str2=['C:\Z\output\',filename(i,1).name,'\Patch_l.mat'];
   eval(['save ',str1,' XL_l']);%输出XL_l
   eval(['save ',str2,' Patch_l']);%Patch_l
end


怎么样,是不是好用到哭!你以为eval函数的功能仅此而已的话,那你又错了!例如,经常会遇到需要求解带参数的方程,而且该方程不能显示表达。如公式:[公式],k取一系列的值(1~100),求相应的自变量x的值。代码如下:

clc
clear
sym x %定义符号变量
K=1:1:100; %参数赋值
number=size(K,2);
X=zeros(number,1); %定义输出结果
for i=1:number
   k=K(i);
   str=['x^3+',num2str(sqrt(k)),'*x^(1/2)-',num2str(k),'^2'];
   a=solve(str,'x','Real', true);
   eval(a)
   X(i,:)=ans;
end

eval函数的妙用绝不仅仅是这些,当你要重复做一些事的时候,变量名稍有些不同,动一动脑筋,eval函数一般都能解决




size:获取数组的行数和列数
length:数组长度(即行数或列数中的较大值)
numel:元素总数。



快捷键:

  • ctrl + C: 中断正在跑的程序

  • ctrl + R: 多行注释

  • ctrl + T: 多行去除注释

  • ctrl + i : 自动缩进对齐

  • shift + TAB: 多行向右缩进

  • TAB: 自动补全

清理

>> clc % 清空Command Window

>> close all % 关闭所有图片窗口

>> close(h) % 关闭图片窗口h (e.g., h = figure(1))

>> clf % 清理当前图片窗口

>> clear % 清空所有变量

>> clear var1 var2 % 清理变量var1 var2 (注意用空格分隔)

>> clearvars -except var3 var4 % 理除var3 var4以外的全部变量



close all;clear all;clc;关闭之前所有图片;清除所有变量;清除命令行窗口为空白。在程序开头写上这三句话有助于新程序不受之前代码影响。

ctrl+i:排版选中的代码。ctrl+h:替换变量。ctrl+r:批量注释代码。ctrl+t:批量恢复已注释代码。

%:注释。%%+解释:声明以下代码为整体。…:续行,一行代码过长,可在中间写…,下一行接着写。

surf:画三维图片,加“shadding interp”图片更好看,加“colorbar”图片结果含义更清楚。imagesc:surf的二维形式,在需要复制结果图时候复制这个函数的图,要不然复制surf的图有可能会使MATLAB死机。

saveas:surf后加这句话可将图片保存至指定目录。

isnan和isinf:找矩阵中nan和inf。

find:找矩阵特定值,[row,col]=find(a==1),返回矩阵a中所有1的行和列。

plotyy:一张figure画两种坐标刻度的曲线。

set:set(gcf,)设置figure属性,set(gca,)设置坐标轴属性,set(gch,)设置句柄属性。在代码最后一行随便加句话,断点设置在此,运行就停在这里,鼠标放在哪个变量上就可以看到该变量值。



查询

[注意] help, doc, edit 命令也可用于自定义函数,其帮助程度取决于该自定义函数的注释规范程度

>> help matlab_fun % Matlab内置函数matlab_fun的帮助(简略)

>> doc matlab_fun % Matlab内置函数matlab_fun的说明文档(详细)

>> edit matlab_fun % 打开内置函数matlab_fun的script (source code)

>> pwd % 当前文本路径

>> which some_fun % 找出build-in函数或自定义函数的具体路径

>> class(var) % 获取变量var的类型

>> dir() % 当前路径下的所有文件

>> dir(’some_path\’) % 某路径下的所有文件

>> dir(’some_path\*.m’) % 某路径下所有的matlab文件(同理,.jpg, .csv文件等等)


杂的

>>  addpath(genpath(pwd)) % 添加当前目录的所有子目录到搜索路径中

% 程序运行完毕后提示音
>> beep on;
>> for i = 1:1e3; end  % script: 运行完毕后有提示音
>> beep

% 程序运行时间
>> tic
>> for i = 1:1e3; end % script 运行时间
>> t = toc

% 程序运行出错时停止
>> dbstop if error
>> MyScript % MyScript中的函数出错时,停止在错误处,而不是返回错误并且中断


1,which命令,可以找到命令所在的具体路径
例如:

>> which fft
built-in (D:\MATLAB\R2008b\toolbox\matlab\datafun\@logical\fft)  % logical method

另外,新版的matlab在命令行双击tab能自动补全。


2,获得一个变量的类型,用class函数
例如:

>> class([0 1])  % double
>> class('test')  % char




进度条+完成提示音。

h = waitbar(0,'Text'); %进度条
for i=1:100
   pause(.1);
   waitbar(i/100);
end
close(h);
beep;       % 提示音


如何加快运算速度以及书写可读性?

1.尽量调用matlab已有函数,相信我,你不会比它写得好的
2.凡是需要重复计算的内容,写成子程序然后调用,这一点非常重要!
3.能矩阵运算就不要for循环,能用parfor时更佳
4.点乘运算真是太方便了
5.三个点让代码换行,让代码更简洁
6.多用空格分开变量,如 x = 5;相信我,写多了之后,代码更好看
7.不同区域用 %% 分块,爽得不能呼吸
8.system函数,调用外部软件,如OpenSees,很好用!


设置运行完后自动关机:
system('shutdown -s -t 900 -f')  
放在程序最后一句的位置,然后去睡觉


采用doc命令获得详细的帮助文档

如输入:doc sort