Matlab系列之程序优化

时间:2022-07-22
本文章向大家介绍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)多重循环的时候,可以在外运行循环次数少的,在内运行循环次数多的

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