提高matlab运行速度和节省空间的心得

提高matlab运行速度和节省空间的心得

首先推荐使用matlab 2006a版本,该版本优点很多(不过有一个小bug,就是通过GUI自动生成的m文件居然一大堆warning,希望在已经发布了的2006b版本中有改善),其中对于编程人员来说比较突出的一个就是编辑窗口的自动语法检查功能。这可以在一定程度上避免使用没有被定义或赋值的变量,另外,也可以帮助你优化代码,【例1】的【方案3】就是因为我看到matlab编辑窗口的warning而得到的启发。顺便提一下,虽然matlab不像其他语言那样,对变量采用“先定义,后使用”的规则,但是,我的经验是,在使用一个变量之前,最好先对它进行“定义”,这里的“定义”是指为它分配空间,这样不但可以提高运行的速度(这在matlab的帮助中也提到,详见Preallocating Arrays一节),而且还可以减少出错的几率,特别是在循环赋值、且变量大小不固定的时候(对此可参阅这个帖子:http://vib.hit.edu.cn/forum/thread-23732-1-9.html)。

下面说说如何对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中,想加快运行速度,不但要减少循环的层数,而且,还要减少循环的次数。

以下是对【例2】(实现大脑激活区检测)的不同实现的结果比较:(核心工作是对73000个前景点相应的时间序列进行EMD处理,生成10个左右的imf,其中抽取每个imf时平均迭代大概10次左右)

版本1:完全用matlab编写——运行时间大约是200分钟,也就是说,要在matlab做73000*100次循环,最头痛的是迭代时的需要产生样条包络,默认的spline函数耗时相当多;

版本2:用matcom转换成cpp文件后在Borland C++ Builder中运行,完全脱离matlab——由于spline函数耗时太多,因此转换前改用了折线包络,而非样条包络,运行时间为15分钟左右,不过这个结果是对仿真数据,非实际数据而言的,因为我仍未解决matrix.h和matlib.h不能共存的问题,故无法对实际数据进行测试,不过一般来说实际数据比仿真数据运行速度更慢;

版本3:把核心代码(基于样条包络的EMD算法)做成dll文件后在matlab中调用——整个程序,从数据输入到数据输出,只在一个地方使用了一层for循环(就是【例2】中【方案2】的循环),且结合上述优化方案,对于实际数据大概5分钟就能得出结果。

小结:要学好matlab,有效地使用matlab,一定要摆脱C++的思想。能不用循环的地方,尽量不要使用(例如求极值点等这些算法基本上可以不使用循环便可实现),逐渐抛弃C++的逐点运算的思想,多从矩阵的整体(或分块)上考虑。虽然matlab 2006a版对循环已经改进不少,但是,循环的确是造成程序运行速度降低的主要原因。matlab提供的远远不止在调用函数上的方便(例如在C++中编写fft、dwt等函数可能需要几十甚至几百行,而在matlab中只需要一两个语句),运行速度慢或许是没有使用好它,让它发挥出所长所致的。想matlab更高效地为你服务,那就需要不断修改、优化你的代码吧(我的程序编写大概用了一个星期,而修改、优化的时间就用了两个多星期,呵呵)。最后,套用某人的一句话来作结:与其抱怨matlab运行速度慢,不如先改进一下你的算法吧。

时间: 2024-09-30 06:37:53

提高matlab运行速度和节省空间的心得的相关文章

虚拟机空间使用心得

最近使用虚拟机感觉虚拟机的硬盘空间不断增加,把相应的垃圾清理之后发现外部的物理机硬盘容量没有相应的减少,让我感觉很是头疼,这样的话相当于一部分空间被不明物吃掉.后来发现Shrink这个命令:VMwaretoolboxcmd disk shrink c:\ 这样的话C盘空间就会被彻底清理.用同样的方法可以清理其他磁盘. 在虚拟机里我们发现使用shrink命令的某些时候,这个命令式不被允许的,那是因为我创建了快照,说道快照很多人就不知道快照是做什么.相信大家都去过网吧,在网吧里我们可能需要安装自己需

C++ Primer 学习笔记_105_特殊工具与技术 --联合:节省空间的类

特殊工具与技术 --联合:节省空间的类 联合是一种特殊的类.一个 union 对象可以有多个数据成员,但在任何时刻,只有一个成员可以有值.当将一个值赋给 union 对象的一个成员的时候,其他所有都变为未定义的. 为 union 对象分配的存储的量至少与包含其最大数据成员的一样多.联合提供了便利的办法表示一组相互排斥的值,这些值可以是不同类型的. 1.定义联合 作为例子,我们可能有一个处理不同各类数值或字符数据的过程.该过程可以定义一个 union 来保存这些值: union ToKenValu

windows系统做了压缩文件以节省空间之后,sqlserver服务无法启动

首先查看日志文件:发现有两个严重错误. 2014-07-27 22:28:32.81 spid7s      Starting up database 'master'. 2014-07-27 22:28:32.90 spid7s      错误: 5118,严重性: 16,状态: 1. 2014-07-27 22:28:32.90 spid7s      文件 "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DA

BitMap排序-大数据量节省空间

package com.jp.algorithm.sort; /** * 假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复).那么我们就可以采用Bit-map的方法来达到排序的目的.要表示8个数 * ,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0 * 然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1. * 然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有

Redis节省空间

节省空间 使用较短的键名 内部编码的优化.每种类型可以使用不同的数据结构来实现,通过配置文件可以配置在某些条件来触发使用不同的数据结构. 如果发现错误,请轻拍,欢迎留言交流,谢谢

一种节省空间的交换变量的基本算法

一种节省空间的交换变量的基本算法,一个很简单的算法 因为其中没有引入temp变量,所以可以节省空间 代码如下: 一种节省空间的交换变量的基本算法

IOS 9 将删除Apps以节省空间供系统升级

IOS 9 将删除Apps以节省空间供系统升级 IOS 9 beta 2早期的使用者发现了一个新功能,当没有足够空间安装系统升级时,系统会暂时删除过载设备上的Apps.据报道,许多使用较小内存8GB和16GB的iPhones的用户很难将最新的升级适配到他们的移动设备上.并且,尽管IOS 9只是IOS 8大小的一小部分(它们分别是1.3GB和4.3GB),苹果这次很明显正尽力将类似的抱怨消灭在萌芽中.当然,新功能会在升级完成后重新安装删除掉的Apps,而且,可能包含随着Apps删掉的用户数据. 原

七牛云上传视频如何有效做到节省空间

在上传视频的时候,我们通常会保存到第三方[七牛云]平台.不过大多数程序员在系统后台上传视频后,一般都是保存到了本地,如果视频非常多或者视频容量特别大的情况下,那么我们的服务器迟早有一天会满,为了节省空间,下面教大家再上传视频时,如何以有效的节省服务器空间,一般情况下会把这些文件存到第三方,也就是需要我们下载qiniusdk,把qiniusdk放如Vendor目录下. 这里我们以课程视频为例子,实现的hmtl源代码如下:<tr> <td class="text">

如何通过删除打印机驱动程序来节省空间?UninstallPKG疑难解答!

电脑用的时间长了,肯定内存也会越来越多,如何通过删除打印机驱动程序来节省空间?UninstallPKG疑难解答带给您,一起来看看吧. 如果您在UninstallPKG软件包列表中看到打印机驱动程序,则可以继续进行卸载. 但是,驱动程序可能没有出现在列表中,因为默认情况下,UninstallPKG不允许删除系统软件包,因为这可能会导致系统损坏甚至无法启动. 要显示驱动程序,请按照以下步骤操作: 1.打开首选项,然后从“忽略安装程序包”列表中删除“ OS X安装程序”,“软件更新”,“ Softwa