博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab程序性能优化与混合编程技术介绍
阅读量:5150 次
发布时间:2019-06-13

本文共 1690 字,大约阅读时间需要 5 分钟。

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,由于各个模块间隔离的很好,可以很方便的进行修正。

 

转载于:https://www.cnblogs.com/emanlee/archive/2012/02/27/2370504.html

你可能感兴趣的文章
OAuth2 .net MVC实现获取token
查看>>
java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查
查看>>
使用Reporting Services时遇到的小问题
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
js兼容公用方法
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>