资料介绍
作者:猫叔 来源:科学计算Tech微信公众号
用过Matlab的同学应该都知道,Matlab的慢是出了名的,但是再慢也有优化的方式,下面我们给出几个Matlab编程中常用的优化技巧。
在讲优化方法之前,首先要说的就是Matlab中用tic toc的方式来计算运行时间,这是个常识。当然,想统计具体的耗时,可以用profile工具。
1. 向量化操作
这个应该是用过Matlab的同学都清楚的一点,Matlab中操作向量和矩阵的速度要比使用for循环的速度快很多,是因为其底层调用了高性能线性代数库BLAS库和LAPACK库。这个就不多说了。
2. 内存预分配
在Matlab中我们可以定义一个空矩阵
mtx = [];
然后后面再给它加入一些数据,而且这个矩阵大小可以随着我们填入数据的多少而变化。像下面这个程序
tic n = 1000; mtrx = []; init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc
这个程序的运行时间是多久呢?在我电脑上是0.2秒。
那这个程序有什么问题呢?就是我们没有为这个矩阵分配一个内存空间,而且在循环中,矩阵大小是变化的,这就导致每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。
因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。
所以,我们应该把程序修改如下:
tic n = 1000; mtrx = zeros(n,n); init = 1.0; for i = 1:n for j=1:n mtrx(i,j) = init + 1.0; end end toc
这个程序只用了0.007秒的时间就运行完成了,可见它们的差距有多大。
3. 按列存储
Matlab中默认是按列存储的,也就是说,列向量在内存中是连续排列的,对连续的数据做处理肯定是要快的,所以我们在定义向量时一般都会使用列向量。下面对比矩阵中对行做操作和对列做操作花费的时间。
n = 10000; mtrx = rand(n,n); mcol = zeros(n,1); mrow = zeros(1,n); tic for i=1:n mcol(i) = sum(mtrx(:,i)); end toc
我们对矩阵中的每一列都求和,总共用了0.17秒。
tic for i=1:n mrow(i) = sum(mtrx(i,:)); end toc
再对矩阵中的每一行求和,用了0.8秒。
可以看出,对列操作比对行操作速度要快很多。
4. 数据类型
在Matlab中,数据类型默认是double型,对使用者来说,无需太多关心数据类型当然是省心省力的,但这也带来了一个问题就是double型占用的内存较多,还有可能拖慢程序的运行速度。所以,在适当的情况下,我们可以把数据类型选择为逻辑型、字符型、整型等。但这样还需要注意的一点是,一个变量在改变数据类型时会消耗额外的时间,因此还不如重新建一个新变量。
高效编程的内容就先写这么多,后面还会继续补充。下面说一个Matlab调试中断点设置问题。在一个for循环中,比如for i=1:n,我们想在i=100的进入断点,这个时候应该怎么用?以前的时候我们都会这么写。
for i=1:n if(i==100) pass end end
把断点设置在pass处,但其实不用这么弄。Matlab中提供了条件断点的设置方式。在循环中右键选择设置条件断点,如下图所示。
Figure 1. 条件断点设置1
在下面的窗口中填入条件即可,比如i==100。
Figure 2. 条件断点设置2
这样,当程序运行到i==100时就会进入断点,不需要自己再写额外的语句。
- MATLAB编程指南pdf03 0次下载
- MATLAB编程指南pdf02 0次下载
- MATLAB编程指南pdf01 0次下载
- 使用MATLAB进行线性编程 0次下载
- MATLAB的循环向量化编程方法的详细资料研究 4次下载
- 幅频特性曲线Matlab编程的资料免费下载 5次下载
- MATLAB高效编程技巧应用与25个案例分析的详细资料概述 0次下载
- 《matlab编程进阶》.pdf 0次下载
- 菜鸟入门Matlab编程 19次下载
- Qt与Matlab混合编程 0次下载
- MATLAB高效编程程序源代码 6次下载
- MATLAB编程_第二版 0次下载
- matlab扩展编程 1次下载
- MATLAB编程基础与典型应用_刘会灯 0次下载
- matlab编程入门基础与应用
- MATLAB信号处理常用函数详解 964次阅读
- 讲解MATLAB/Simulink HDL使用入门 1040次阅读
- 关于MATLAB求导实践的总结 1554次阅读
- 30个MATLAB图形绘制 1439次阅读
- 基于六面体单元热应力问题的Matlab有限元编程求解 2517次阅读
- 基于Matlab有限元编程的变截面悬臂梁分析 3599次阅读
- MATLAB程序调试的方法及工具介绍 6642次阅读
- MATLAB基础知识MATLAB的简介,编程环境和基本操作的详细概述 7378次阅读
- matlab串口数据采集 2.4w次阅读
- MATLAB如何实现图像增强灰度变换直方图均衡匹配 1w次阅读
- matlab-插值 1665次阅读
- matlab输入矩阵的格式的方法步骤 2w次阅读
- 基于LabVIEW和Matlab混合编程的小波降噪方法 1w次阅读
- 专家支招:使用MATLAB和Simulink算法创建FPGA原型 1.6w次阅读
- 基于Matlab的FIR带通滤波器设计与实现 2.9w次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1491次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 95次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 11次下载 | 免费
- 6100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 7基于单片机和 SG3525的程控开关电源设计
- 0.23 MB | 4次下载 | 免费
- 8基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30320次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537793次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
评论
查看更多