没有合适的资源?快使用搜索试试~ 我知道了~
提高MATLAB运行速度和节省空间的心得合集 (2).pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 174 浏览量
2021-10-12
14:45:47
上传
评论
收藏 580KB PDF 举报
温馨提示
试读
17页
。。。
资源推荐
资源详情
资源评论
提高 matlab 运行速度和节省空间的心得合集
首先推荐使用 matlab 2006a 版本,该版本优点很多,其中对于编程人
员来说比较突出的一个就是编辑窗口的自动语法检查功能。这可以在一
定程度上避免使用没有被定义或赋值的变量,另外,也可以帮助你优化
代码,【例 1】的【方案 3】就是因为我看到 matlab 编辑窗口的 warning
而得到的启发。顺便提一下,虽然 matlab 不像其他语言那样,对变量
采用“先定义,后使用”的规则,但是,我的经验是,在使用一个变量之
前,最好先对它进行“定义”,这里的“定义”是指为它分配空间,这样不
但 可 以 提 高 运 行 的 速 度 ( 这 在 matlab 的 帮 助 中 也 提 到 , 详 见
Preallocating Arrays 一节),而且还可以减少出错的几率,特别是在循
环 赋 值 、 且 变 量 大 小 不 固 定 的 时 候 ( 对 此 可 参 阅 这 个 帖 子 :
[url]http://vib.hit.edu.cn/forum/thread-23732-1-9.html[/url])。
下面说说如何对 matlab 提速的问题,我会使用两个例子来说明。
【例 1】任务描述:根据 A 的取值使用 imshow 函数显示矩阵 B
A = randn(100, 100);
B = zeros(size(A));
【方案 1】
[X,Y] = find(A > 0.6);
For i = 1:length(X)
B(X(i),Y(i)) = 1;
End
【方案 2】
B = zeros(size(A));
X = find(A > 0.6);
B(X) = 1;
【方案 3】:
B = zeros(size(A));
X = logical(A > 0.6);
B(X) = 1;
事实上,【方案 1】到【方案 2】的改进在“再谈 Matlab 的多维数组问题”
一文中已经提及过,但是没想到自己在矩阵输入的时候注意到了,但是
在矩阵输出的时候就忘记了,看来程序是需要不断修改、优化的,技巧
也是需要不断巩固的。至于【方案 3】,是得益于 matlab 的 warning 提
示。
然而,这并不是表示所有类似的地方都可以用logical 代替 find,当遇到
循环次数与 X 有关时,用 find 会更有效,对此可以参考【例2】的【方
案 2】,这是用 logical 实现不到的。
【例 2】任务描述:有一个四维矩阵 A(大小为 61*73*61*210),其中
前三维表示一个包含大脑结构的立方体,最后一维表示大脑中每个点对
应的一个长度为 210 的时间序列。另外有一个三维矩阵 Mask(大小是
61*73*61),B 是二值的,其中 1 表示该点是前景点(大脑),0 表示该
点是背景点。任务是对 A 中属于前景点的时间序列进行 EMD 处理,从
而判断该前景点是否属于激活区。
显然,这个问题要利用循环来完成。在本人写的“再谈 Matlab 的多维数
组问题”一文中已经提到可以把多维数组转化为一维数组来处理,在这
里,也要利用这个思想。而且,从下文可以看到,正是因为 “多维变一
维”的出现,才令程序得到更进一步的提速。
首先利用 reshape 函数把四维矩阵 A 变成二维矩阵 B,把三维矩阵 Mask
变成一维矩阵 C:
B = reshape(A, 61*73*61, 210);
C = Mask(:);
t = 1:210;
【方案 1】
iTotalVoxel = 61*73*61;
for k = 1:iTotalVoxel
if C(k) == 1
temp = B(k,: );
imf = emd(t, temp);
…
end
end
【方案 2】
D = find(C);
iTotalBrainVoxel = length(D);
for k = 1: iTotalBrainVoxel
temp = B(D(k),: );
imf = emd(t, temp);
…
end
【方案 1】明显是基于 C 语言的套路,而【方案 2】则充分避免了 matlab
的弱点――循环,经过改进以后(“多维转一维”为此提供了保证,多维
的话,恐怕要使用形如 A(X(k),Y(k),Z(k),:)的形式了),由于循环次数的
降低(大约降低为原来的 1/3),故运行时间大致上减少了一半。
由此可见,在 matlab 中,想加快运行速度,不但要减少循环的层数,
剩余16页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功