python和matlab运行速度哪个快_MATLAB运行效率

本文探讨了提高MATLAB程序运行效率的多种策略,包括循环矢量化、预分配内存、使用函数代替脚本、用C-MEX处理循环以及内存管理。循环矢量化可以显著减少执行时间,预分配内存避免了动态扩展带来的额外开销。使用函数而非脚本文件可减少内存加载次数,提高执行速度。对于必须使用循环的情况,适当调整循环结构和使用C-MEX文件能进一步提升计算速率。此外,合理使用MATLAB内置函数和避免不必要的数据类型转换也能优化性能。文章通过实例和代码对比展示了优化效果,强调实践和测试的重要性。
摘要由CSDN通过智能技术生成

用过Matlab的人都知道,Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的运行效率,matlab提供了多种实用工具及编码技巧。

1. 循环矢量化

Matlab是为矢量和矩阵操作而设计的,因此,可以通过矢量化方法加速M文件的运行。矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作。下面给出一个循环的例子:

i=0;

for n = 0:0.1:1000

i=i+1;

y(i)=cos(n);

end

那么我们可以矢量化为:

n= 0:0.1:1000;

y=cos(n);

我们可以用tic和toc函数来查看上述各代码运行的时间,采用for循环的程序0.39秒(具体时间和计算机配置有关),而矢量化后几乎耗时为0。

2. 给数组或矩阵预分配内存

特别是使用大型数组或矩阵时,Matlab进行动态内存分配和取消时,可能会产生内存碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避免这个问题。

3. 用函数代替脚本文件

因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。

4. 用Mex文件编写循环代码

Matlab提供了与C和C++的接口,那么我们可以在用C或C++语言编写耗时的循环代码,然后通过接口程序在Matlab中转换成dll文件,这就是我们所要的Mex文件,通过这种方法可以极大地提高计算速率。

1.尽量避免使用循环结构

MATLAB变量的基本类型是矩阵,当对矩阵的每个元素循环处理时,运算速度很慢。因此编程时应尽量把数组和矩阵看作一个整体来进行编程,而不是像其他的程序设计语言那样,使用循环结构对矩阵的元素循环进行处理。利用MATLAB提供的用于矢量化操作的函数,把循环矢量化,这样既可以提高编程效率,也可以提高程序的执行效率。下面给出一个循环的例子:

i=0;

for n = 0:0.1:100

i=i+1;

y(i)=cos(n)

end

上述程序段把数组中的每个元素都进行函数值计算,这样会耗费大量的运算时间,我们可以把数组看作一个整体来处理,计算函数值,可以修改这个程序段如下。

n = 0:0.1:100;

y = cos(n)

通过使用MATLAB专门提供的测试程序运行时间的函数,可以发现,把数组看作一个整体,进行操作后,执行效率提高约300倍。

另外,在必须使用多重循环的情况下,建议在循环的外环执行循环次数少的,内环执行循环次数多的,这样也可以显著提高程序执行速度。

2.在使用数组或矩阵之前先定义维数

MATLAB中的变量在使用之前不需要明确地定义和指定维数。但当未预定义数组或矩阵的维数时,当需赋值的元素下标超出现有的维数时,MATLAB 就为该数组或矩阵扩维一次,这样就会大大降低程序的执行效率。因此,在使用数组或矩阵之前,预定义维数可以提高程序的执行效率。

3.对矩阵元素使用下标或者索引操作

在MATLAB中,矩阵元素的引用可用两个下标来表示。例如:A(i,j)

表示矩阵的第i行第j列的元素;A(1:k,j)表示矩阵A的第j列的前k个元素;A(:,j)

表示矩阵的第j列的所有元素。求矩阵A的第j列元素的平均值的表达式为mean(A(:,j))。

4.尽量多使用函数文件少使用脚本文件

因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。

5.在必须使用循环时,可以考虑转换为C-MEX

当必须使用耗时的循环时,可以考虑将循环体中的语句转换为C-MEX。C-MEX是将M文件通过MATLAB的编译器转换为可执行文件,是按照

MEX

技术要求的格式编写相应的程序,通过编译连接,生成扩展名为.dll的动态链接库文件,可以在MATLAB环境下直接执行。这样,循环体中的语句在执行时不必每次都解释(interpret)。一般来说,C-MEX

文件的执行速度是相同功能的M文件执行速率的20~40倍。编写C-MEX不同于M文件,需要了解MATLAB C-MEX规范。幸运的是MATLAB提供了将M文件转换为C-MEX的工具。

6.内存优化

MATLAB在进行复杂的运算时需要占用大量的内存。合理使用内存和提高内存的使用效率,可以加快运行速度,减少系统资源的占用。

7.内存管理函数和命令

(1)Clear

variablename:从内存中删除名称为variablename的变量。

(2)Clear

all:从内存中删除所有的变量。

(3)Save:将指令的变量存入磁盘。

(4)Load:将save命令存入的变量载入内存。

(5)Quit:退出MATLAB,并释放所有分配的内存。

(6)Pack:把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量。考虑到执行效率问题,不能在循环中使用。

8.节约内存的方法

(1)避免生成大的中间变量,并删除不再需要的临时变量。

(2)当使用大的矩阵变量时,预先指定维数并分配好内存,避免每次临时扩充维数。

(3)当程序需要生成大量变量数据时,可以考虑定期将变量写到磁盘,然后清除这些变量。

当需要这些变量时,再重新从磁盘加载。

(4)当矩阵中数据极少时,将全矩阵转换为稀疏矩阵。

提高MATLAB程序效率的几点原则,这些都是俺在这两年中参加四次数模编写大量m程序总结的经验,加之网上很多英雄也是所见略同。

1.“计算向量、矩阵化,尽量减少for循环。”[/B]

因为MATLAB本来就是矩阵实验室的意思,他提供了极其强大而灵活的矩阵运算能力,你就没必要自己再用自己编写的for循环去实现矩阵运算的功能了。另外由于matlab是一种解释性语言,所以最忌讳直接使用循环语句。但在有些情况下,使用for循环可以提高程序的易读性,在效率提高不是很明显的情况下可以选择使用for循环。

口说无凭,下面是利用tic与toc命令计算运算所用时间的方法,测试两种编程的效率。需要说明的是没有办法精确计算程序执行时间,matlab帮助这样写到“Keep

in mind that tic and toc measure overall elapsed time. Make sure

that no other applications are running in the background on your

system that could affect the timing of your MATLAB

programs.”意思是说在程序执行的背后很可能有其他程序在执行,这里涉及到程序进程的的问题,m程序执行的过程中很可能有其他进程中断m程序来利用cup,所以计算出来的时间就不仅是m程序的了,在这种情况下我把那些寄点去掉,进行多次计算求他的平均时间。

n = 100;

A(1:1000,1:1000) = 13;

C(1:1000,1) = 15;

D(1:1000,1) = 0;

for k = 1:n

D(:)

= 0;

tic

for

i = 1:1000

for

j = 1:1000

D(i)

= D(i) + A(i,j)*C(j);

end

end

t1(k)

= toc;

%------------------

D(:)

= 0;

tic

D

= A*C;

t2(k)

= toc;

end

u = t1./t2;

u(u<0) = [];

plot(u)

p = mean(u)

t1、t2分别代表用for循环编程和矩阵化编程计算矩阵乘向量所用时间,u代表时间的比值。u(u<0)

= [];是认为t1不可能小于t2,所以去掉不可能出现的情况。然后画出图形计算平均值。

经多次试验结果大致相同,其中一次结果如下:

p =

9.6196

------------t1时间是t2的十倍左右。

2.“循环内大数组预先定义--预先分配空间”[/U]

这一点原则是极其重要的,以至于在编写m程序时编辑器会给出提示“'ver'

might be growing inside a loop.Consider prealloacting for

speed.”

clear

n = 50;

m = 1000;

for k = 1:n

A

= [];

tic

A(1:m,1:m)

= 3;

for

i = 1:m

A(i,i)

= i;

end

t1(k)

= toc;

%------------

A

= [];

tic

for

j = 1:m

A(j,j)

= j;

end

t2(k)

= toc;

end

t2(t1>10^9) = [];

t1(t1>10^9) = [];

plot([t1;t2]')

t1、t2分别表示预先分配空间和循环中分配空间的时间,下图上面一条t2、下面t1

3.“尽可能利用matlab内部提供的函数”[/U]

因为matlab内部提供的函数绝对是各种问题的最优算法,那写程序都是他们大师级人物写出来的,程序应该说相当高效,有现成的为什么不用那! 这个原则就不用实际的程序测试了。

关于MATLAB

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值