没有合适的资源?快使用搜索试试~ 我知道了~
提高MATLAB运行效率.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
7 浏览量
2023-02-20
18:40:07
上传
评论
收藏 126KB DOCX 举报
温馨提示
.
资源推荐
资源详情
资源评论














提高MATLAB 运行效率
用过 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 k j
A
j
第 行第 列的元素; (1: , )表示矩阵 的第 列的前 个元素; (:, ) 表
k
A j
j
A
j
示矩阵的第 列的所有元素。求矩阵 的第 列元素的平均值的表达式为
A j
mean( (:, ))。
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
剩余22页未读,继续阅读
资源评论


xxpr_ybgg
- 粉丝: 5907
- 资源: 3万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
