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














提高 matlab 代码运行效率
Matlab 是一种解释性语言,追求的是方便性、灵活性以及交互性,因此在快速性上要
比 C 语言这种性能强劲著称的稍逊一筹。然而,通过一些手段,我们也能让 MATLAB 语
言快起来,甚至和 C 差不多了!
1 可行方法
1.1 循环矢量化
MATLAB 变量的基本类型是矩阵,当对矩阵的每个元素循环处理时,运算速度很慢。
利用 MATLAB 提供的用于矢量化操作的函数,把循环矢量化,这样既可以提高编程效率,
也可以提高程序的执行效率。下面给出一个循环的例子:
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 函数来查看上述各代码运行的时间,可以发现,把数组看作一个
整体,进行操作后,执行效率提高约 300 倍。
另外,在必须使用多重循环的情况下,建议在循环的外环执行循环次数少的,内环执
行循环次数多的,这样也可以显著提高程序执行速度。
下面再举一个例子
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 的十倍左右。
1.2 在使用数组或矩阵之前先定义维数
MATLAB 中的变量在使用之前不需要明确地定义和指定维数。但当未预定义数组或矩
阵的维数时,当需赋值的元素下标超出现有的维数时,MATLAB 就为该数组或矩阵扩维一

次,这样就会大大降低程序的执行效率。因此,在使用数组或矩阵之前,预定义维数可以
提高程序的执行效率。
1.3 对矩阵元素使用下标或者索引操作
在 MATLAB 中,矩阵元素的引用可用两个下标来表示。例如:A(i,j) 表示矩阵的第 i
行第 j 列的元素;A(1:k,j)表示矩阵 A 的第 j 列的前 k 个元素;A(:,j) 表示矩阵的第 j 列的所
有元素。求矩阵 A 的第 j 列元素的平均值的表达式为 mean(A(:,j))。
1.4 用函数代替脚本文件
因为每次调用 MATLAB 的脚本文件都需要将不必要的中间变量加载到内存中,每执
行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次
调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高
执行效率的一种方法。
1.5 用 Mex 文件编写循环代码
Matlab 提供了与 C 和 C++的接口,那么我们可以在用 C 或 C++语言编写耗时的循环代
码,然后通过接口程序在 Matlab 中转换成 dll 文件,这就是我们所要的 Mex 文件,可以在
MATLAB 环境下直接执行。通过这种方法可以极大地提高计算速率。一般来说,C-MEX
文件的执行速度是相同功能的 M 文件执行速率的 20~40 倍。
1.6 尽可能利用 matlab 内部提供的函数
因为 matlab 内部提供的函数绝对是各种问题的最优算法,那写程序都是他们大师级人
物写出来的,程序应该说相当高效,有现成的为什么不用那!这个原则就不用实际的程序
测试了。
1.7 给数组或矩阵预分配内存
特别是使用大型数组或矩阵时,Matlab 进行动态内存分配和取消时,可能会产生内存
碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避
免这个问题。

这一点原则是极其重要的,以至于在编写 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
剩余17页未读,继续阅读
资源评论


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


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