matlab程序代码优化,性能优化
Matlab是一种强大的计算工具,方便的矩阵运算与工具箱为编程人员提供了极大的便利。但是其性能的缺失使得处理一些大计算量问题时显得效率不高,matlab程序的优化应从几个方面展开:
1.矩阵提前分配空间,矩阵第一次使用之后避免改变矩阵的维数。
2.尽量使用矩阵运算,少使用循环。
3.调用多次的计算代码写成函数形式,而不是写在脚本程序中,因为Matlab中,函数是被翻译成微码的,执行效率更高。
4.如果无法避免使用循环,可以使用混合编程技术实现该段代码,这种方法在循环次数很大时可以将性能提升数十倍甚至上百倍。
5.对于特定的算法,首先想到的不应是自己编写代码,而是查看matlab帮助文档,在matlab自带函数库中寻找是否存在现成函数。这样做有两个方面考虑,一方面matlab自带函数很多并不是真正的脚本文件,而是使用其他高级编程语言编译成的函数文件(这种函数文件的显著特点是打开该函数对应的m文件,会发现内容中只有注释而没有实际的代码,熟悉混合编程的同学看到这点会很熟悉,因为进行混合编程时,一般会创建一个和对应函数名相同的m文件用于保存注释信息。matlab的开发者也使用了这一规范,用户所看到的只是该函数的注释而已,实际的计算代码是保密的)使用这些函数,远比自己编写要高效;另一方面,使用自带函数,可以显著提高开发效率,减少编程者的工作量。
综合以上考虑,开发高效的matlab计算程序的步骤是:
1.需求分析:首先对所要实现的算法进行划分,哪些部分可以使用matlab的脚本语言进行处理,哪些部分可以使用混合编程技术实现。我个人倾向于对于核心的计算代码使用混合编程技术实现,数据的初始化、最后结果的可视化等使用matlab的脚本语言实现。这样选择的依据是核心计算代码使用混合编程技术实现后,真正的代码可以保密,对于用户,仅需提供其编译好的mex文件。另一方面,数据初始化需要很多数据处理代码,如果使用C语言实现,意味着大量的循环,而使用matlab可以用矩阵的方式处理而避免使用循环,编程容易而且不易出错。最后,结果的可视化一般需要调用底层的库,而使用C语言实现这些调用显然不如直接使用matlab容易。
2.编写计算代码:分析好各个计算流程应该使用的编程方法之后,下一步就是对算法进行实现,这一过程需要到前面介绍的几个技巧,如矩阵提前分配空间,不要随便改变矩阵的维数等等。这部分最好分模块书写,各个部分之间做好封装和隔离,特别是混合编程时,使用C语言编写的代码要做好注释,我的个人习惯是C语言中用到的变量和m文件中的一样,这样可以方便识别和debug。使用混合编程技术时,C语言编写的代码是在matlab环境下进行编译的,这就使得debug变得极其困难,现在版本的Matlab还不支持对C语言代码进行debug,C函数运行过程中变量的监视几乎是不可能的。为了解决这一问题,我个人喜欢在专业的C编译环境下进行编程(如VC),将整个C函数可以分解为三个部分:1.数据输入;2.数据处理;3.结果保存。这三个部分中,第1个和第3个部分主要使用matlab的语法规则处理,而核心的第2部分,则是使用通用的C语言语法。实际debug主要关注的是第2个部分,于是我们可以在VC中编写一个测试版本的函数,这个函数中,所有内容都是和传统的C语言规范一样,debug完成后,修改其数据输入和输出部分的代码,使其满足C-MEX标准,之后把这一修正的代码到matlab环境下进行编译。
3.模块耦合。通过第二步,我们已经获得了所有计算模块,且各个模块都已经没有bug,可以独立运行了,但是模块独立运行并不代表整个程序可以很好的工作,这一步所做的工作就是将各个模块进行耦合、拼接、调试,直到各个模块运行完好。前面第二步如果处理的好,这一步将会十分容易,即使存在bug,由于各个模块间隔离的很好,可以很方便的进行修正。