专栏首页电子狂人Matlab系列之程序优化

Matlab系列之程序优化

一般来说,实现同样的功能,可以采用不同的编程方法,而这些不同的编程方法也可能有着不同的运行速度,因此很多时候需要找到较优的那种方法,从而提高代码的运行效率,本篇将要记录的是一些提供M文件执行速度、优化内存管理的常用方法,具体的记录两个很实用的方法,然后简单再说下其他的方法,在平常编程的时候注意并学会使用这些方法,请往下慢慢看

~Show Time~

第一种

不知道你们在使用MATLAB进行循环计算的时候,有没有感觉到过,对矩阵的单个元素作循环

相比将其转化成向量的形式进行运算的速度要慢很多,如果没太理解这句话,可以看以下的代码,然后再回过来理解:

%程序1,矩阵的元素作循环
clear all
clc
tic
x=1;
for k=1:1001
    y(k)=log10(x)
    x=x+0.01;
end
toc

结果:

%程序2,矩阵元素向量化
clear all
clc
tic
x=1:0.01:11;
y=log10(x)
toc

结果:

以上这两个代码只是分别对x进行循环累加以及直接向量化赋值给x,但是得到的运行速度却相差如此之大,当然这也是因为我把结果打印在了命令行窗口中,不然第一种的速度也还会快很多,那样的说服力显然没有这个强了,所以,你GET到这个优化程序的操作了吗?

第二种

此处要记录的第二种方法很好理解,可以这样想象,一个人去做一件事,这件事是他从未接触过的,其结果也是无法预测的,那么他会感觉到实现起来很困难,最终实现的时间也是漫长的,但是如果这个人很清楚的知道自己要做的事,知道实现的方法,那么就可以很高效的完成这件事。

类推,在for循环和while循环中,一个数组的大小随着循环不断的增加,很显然这会影响内存的使用效率,因为只要数组的维度变了,就要找到更大的连续内存区域,用于存放新的数组,就像是那个做事的人在不断尝试不同的方法去实现要做的事,很费时间,但是我们在最开始就给数组设置好一个它最终结果所需的恒定维度,也就是提前分配内存,这样就可以很好的提高内存使用效率,相当于直接给了做事的人一个正确的方法,他只需要照着做就行,很显然效率要高很多。

接下来上几个简单的代码,来进一步加深内存预分配的印象:

%原始代码
x=0;
for k=2:1000
    x(k)=x(k-1)+6;
end
%预分配内存后的代码
x=zeros(1,1000);
for k=2:1000
    x(k)=x(k-1)+6;
end

不知道你们发现没有,在编完原代码后,MATLAB其实会提醒你需要预分配内存,把鼠标移到x的波浪线上,就会出现:

预分配内存的方法,本处代码使用的是zeros函数,将x的所有元素都赋值为0,这样节约了重新分配内存的时间,从而提高程序的效率,除了这个函数以外,还有cell函数也可以,不过这两个分别用于对数值数组和单元数组进行内存分配,不过要注意一点,使用zeros函数为数组分配内存时,如果数组类型要的不是double,则需要做些改变,可以使用下面的语句进行分配:

A=zeros(100,’int8’);
%这个就相当于为A分配了100*100的int8类型的内存。
A=int8(zeros(100));
%这个更好理解,就是生成了一个100x100的double类型的内存,再使用int8函数将其转化为int8的类型。

其他方法

这部分的方法都是比较好理解的,在平常编程前,记住这些要点,然后编写的时候应用上,可以简单有效的对程序进行优化。

1)数组赋值时,避免数组类型的改变、以及第二种方法说的数组大小改变

2)对实数进行操作,尽量避免对复数操作,复数也可以分实部虚部分别进行处理。

3)合理使用逻辑运算符

4)避免重载MATLAB中的内置函数和操作符

5)通常情况下,函数的运行效率要高于脚本文件

6)load和save函数效率要高于文件写和读取的操作

7)多重循环的时候,可以在外运行循环次数少的,在内运行循环次数多的

不知道这篇关于程序优化的点,你懂了多少,如果全懂了,恭喜你,可以给别人炫操作了

本文分享自微信公众号 - 电子狂人(DZKR666),作者:狂人V

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 飞思卡尔恒功率无线充电(中)

    根据波形图我们需要一个电压可变化的充电电路,我们可以想到PWM波,PWM控制技术就是对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等...

    狂人V
  • 飞思卡尔恒功率无线充电(上)

    无线充电接收采用串联谐振,接收线圈串联谐振电容可以有效提高接收电路输出功率。下图为接收整流电路。

    狂人V
  • 数组的运算+矩阵的运算

    近来有点忙于学新东西,时间不太够,所以到现在快将近一个月没更新了,感觉自己都要忘记还有这回事了,哈哈,不多说了,接上之前的篇章内容继续吧,如果有遗忘的,就去温故...

    狂人V
  • 评论列表实例

    DataScience
  • tensorflow和主机的CUDA、CUDNN对应关系

    于小勇
  • 面试题29( 在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为?)

    在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为? A this.A(x) B this(x) C sup...

    Java学习
  • 基于 HTML5 WebGL 的 3D 仓储管理系统

    仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息、资源、行为、存货和分销运作进行更完美地管理,使其最大化满足有效产出...

    HT for Web
  • 最强多层感知机?谷歌科学家用β-LASSO武装MLP,缩小与卷积网络的差距

    谷歌新研究用 LASSO 算法的变体 β-LASSO 武装 MLP,将其在 CIFAR-10 数据集上的准确率提升到 85%。

    机器之心
  • 基于 HTML5 WebGL 的 3D 仓储管理系统

    HT_hightopo
  • 基于 HTML5 的 3D 工业互联网展示方案

    通用电气(GE)、IBM、英特尔等公司主推的“工业互联网”正在经历“产品-数据分析平台-应用-生态”的演进。这主要得益于 Predix 数据分析平台对工业互联网...

    HT_hightopo

扫码关注云+社区

领取腾讯云代金券