标题 | Visual C++调用MATLAB函数库的混合编程技术 |
范文 | 徐治 摘要:Visualc++与MATLAB的混合编程技术是以VC++作为强有力的软件开发工具,而在实现复杂算法时则直接调用MATLAB涵盖很广的算法函数库。这种方式可以做到优势互补,大大减少复杂算法的编码时间。本文介绍了混合编程的基本原理,并详细介绍了基于MATLAB编译器的VC++调用MATLAB函数库的代码编写及项目配置等方面的技术。 关键词:软件开发;Visual c++;MATLAB;混合编程 中图分类号:TP37 文献标识码:A DOI:10.3969/j.issn.1003-6970.2015.02.012 1 混合编程的意义 Visual C++是Microsoft的C/C++语言集成开发工具。它具有C/C++语言运行效率高、代码灵活性高等优点,也具有OOP编程开发效率高,代码的可重用性及可维护性好等优势。同时由于其出身背景,它能提供对Windows API最全面和深入的操控,也能通过MFC、ATL等提供强大易用的封装。因此Visual C++一直是Windows平台上商业软件开发强大的主流工具。 MATLAB是Mathworks开发的一种面向工程和科学计算的高级语言,具有强大的基于矩阵计算的数值分析和系统仿真能力。MATLAB最吸引人之处在于经过30年不断的积累,它建设了一个庞大的函数库,该库远远不止于常见的数学函数运算,而是由大量的面向各种工程技术具体应用的算法工具箱和仿真模块组成。其涵盖的领域从航空航天、电子通信到机械设计,甚至包括数量经济学和医学统计等,几乎无所不包。但作为一种解释型语言,MATLAB存在一些先天的不足,比如运行效率特别低的循环语句、不必要的数组边界检查等,使得MATLAB的运行速度经常会很慢,因此它不适合作为商业软件的开发工具。 在软件开发中,有时会要求实现某些复杂的算法,比如多媒体软件中的信号处理、工程设计软件中的建模仿真等数值分析算法。这些算法要求大量专业性很强的领域知识才能理解,而且其具体实现会相当复杂。程序员在不理解算法原理的情况下编写其代码较为困难,即使写出来也难以保证代码的优化和高效,更难以设计代码测试方案。此时应用本文介绍的Visual C++与MATLAB的混合编程技术就可以在一定程度上跨越这种专业壁垒。 混合编程的基本思路是以VC++编写软件的架构和界面,当需要实现专业算法时,在VC++的代码中直接调用MATLAB函数库中现成的实现代码。混合编程的好处在于取长补短:一方面可以发挥VC++在开发软件上的强大灵活的能力,保证了程序运行的效率,而在涉及复杂算法时又不用费时费力地具体实现代码;另一方面又能利用MATLAB数学函数库中大量成熟可靠的算法实现代码,而不必担心MATLAB的开发效率和运行速度问题。 2 Visual C++调用MATLAB函数库的2种方式 Mathworks公司设计了多种MATLAB与别的高级语言相互调用的接口,比如可以把c语言等高级语言代码段按MATLAB所规定的特定格式规范化后,编译为能为MATLAB直接执行的动态链接子程序,这就叫MEX文件。MEX文件是向MATLAB进行代码移植的主要方式。MAT文件是MATLAB保存数据的标准格式,可以经由它在MATLAB和其他语言之间进行数据的导出和导入。但上述接口不能实现从VC++代码中直接调用MATLAB函数库。具有这种功能的接口主要是以下两种: 2.1 计算引擎 MATLAB的计算引擎是一种可以在别的语言编写的软件中调用MATLAB函数库的机制。它采用C/S模式,C/C++编写的程序作为客户机运行,通过一系列API调用向MATLAB引擎提出计算请求,MATLAB计算引擎作为服务器在后台运行完成计算并返回结果。在Windows环境下,客户机和服务器之间的通信机制是基于ActiveX自动化。但计算引擎必须和整个MATLAB软件系统一起安装,即不能在没有安装MATLAB的机器上运行,因此不太适合于商业软件的开发。 2.2 MATLAB编译器 MATLAB编译器由若干MATLAB的软件工具组成。其实现原理是首先把需要从VC++中调用的函数写成一个M文件,再将M文件转化为C/C++语言的源代码文件。每个源文件相当于一个用C/C++编写的函数的定义与实现文件,只不过该函数的实现不是程序员编写的,而是调用MATLAB函数库中的实现。同时,MATLAB编译器会生成一个动态链接库,它包含相应算法的二进制实现代码。出于版权保护的目的,这些生成的源文件显然不会包含函数的实现代码,而仅仅包含指向上述那个动态链接库的相应入口的调用语句。然后程序员手工将C/C++源文件加入VC++的项目之中,就可以和项目的其他代码一起编译链接,生成可执行文件。 比起计算引擎,MATLAB编译器有一个突出的优点,就是按上述方法生成的软件在运行时,仅仅需要一个通用的运行时刻库和上述那个由编译器生成的动态链接库即可,不需要MATLAB主程序或是某个MATLAB组件,因此可以完全独立地在一台没有安装MATLAB的计算机上运行。这一优点是混合编程能够用于商业软件开发的前提。 3 MATLAB编译器与Visual C++协同使用的基本方法 不同版本的MATLAB其编译器的具体细节存在一些改动,不同版本的VC++与MATLAB协同工作的细节也有所变化,限于篇幅,这些差异不在此罗列。以下的内容是针对Visual Studio.net2010版及MATLAB2010b版的。下面通过一个简化实例来介绍。比如我们需要编写代码来实现数字信号处理中的Levinson-Durbin递归算法,步骤如下: 3.1 在MATLAB中编写M文件 调用Levinson算法的代码如下: function A=My Levi(r) A=levinson(r); 将其保存为文件名为MZ Levi.m的M文件。编写该M文件时除少量特定语句不能包含外基本上和普通M文件一样,也可由多行语句组成。当我们需要调用多个MATLAB库函数时,出于代码可维护性的考虑,一般为每个函数调用单独编写一个M文件。 3.2 配置MATLAB编译器 在开始使用MATLAB编译器前,需要按如下步骤配置它:在MATLAB命令窗口中执行mex-setup命令和mbuild-setup命令。这两个命令会搜索安装在本机上的C/C++编译器并要求程序员指定哪个将与MATLAB协同工作。程序员只要按照提示进行几步选择即可,配置工作由MATLAB自动完成,其主要作用在于按照不同的C/C++编译器版本,确定在源代码转换和生成时所应遵循的语法规范。 除配置MATLAB外,开发工具所在的操作系统也要进行配置。需要给操作系统的环境变量(Windows 7中为用户变量和系统变量)的路径加入MATLAB的有关目录,即指定MATLAB的bin、bin\win32、extern\lib\win32~microsoft等几个子目录的位置。 上述两类配置只需在MATLAB和VC++安装好后执行一次即可。 3.3 用MCC生成C++源代码及链接库 在MATLAB命令窗口中运行工具软件MCC(MATLAB C/C++Compiler): mee-W epplib:My Levi-T link:lib My Levi.m 该命令将根据ME Levi.m生成一系列的文件,它们全部以cpplib选项后面指定的名字作为文件名。其中主要的是My Levi.cpp,My Levi.h,My Levi.1ib,My Levi.dll这几个文件。其中C++源文件需要被手动包含到VCH的项目当中,LIB文件用于VC++的链接器,DLL文件则是运行时动态链接库。如果项目需要调用多个MATLAB算法函数,一般会编写多个M文件,这时可以一次性处理所有的M文件,例如: mee-W cpplib:My Lib-T link:lib My Calll.m My Call2.m My Ca113.m… 此时仍然只生成单一的源文件和库文件,但My Lib.h和My Lib.dll等文件中包含所有调用的定义和入口等。这在M文件很多时显然非常方便。 下面摘抄ME_Levi.h中Levinson算法的C++函数定义,以便后面对它的调用:extern LIB_My_LevLCPP_API void MW_ CALL_ CONV My_Levi(int nargout,mwArray&A,eonst mwArray&r);这个格式是统一的,即参数列表中第一个是输出个数,随后一个或多个是输出参数,再随后一个或多个是输入参数。至此需要在MATLAB中做的工作结束。 3.4 VC++中的调用代码编写 (1)库的初始化及关闭。首先要在程序的某个合适的位置(比如CWinApp::InitInstance())加入对MatLab链接库的初始化代码: 这里演示了C/C++中如何向MATLAB调用传递参数以及取回返回值的方法之一。其中data和ans数组分别是在C/C++中的Levinson算法的输入数据和计算结果,矩阵对象r和A则分别是MATLAB中Levinson算法的输入和输出。如果MATLAB要求的类型是矩阵,将C/C++代码的相应变量定义为多维数组即可。 3.5 配置VC++项目设置 上述代码编写好后,还无法编译链接,因为VC++默认的项目属性中缺少必要的信息,必须手工修改。打开项目属性设置对话框,作如下修改: (1)添加MATLAB外部包含文件和库文件所在的本机路径,包括 (2)在链接器属性之附加依赖项中添加必需的2个库文件,即mclmcrrt.lib和My Levi.lib。注意现在的MATLAB 2010b运行时刻附加库只需要mclmcrrt.lib,不再需要老版的libmat.lib、libmex.lib等库文件。 (3)如果是要运行在64位操作系统上,还要做以下修改:在链接器属性之高级选项中选择目标计算机为MACHINE:X64。在解决方案平台的配置管理器中新建一个目标为X64的平台,然后切换到这个新的X64平台。 上述的编程和配置工作完成后就可以进行编译链接,生成可执行文件了。 3.6 软件的安装 在向用户计算机上安装上述包含对MATLAB的Levinson算法调用的软件时,安装程序必须复制My Levi.dll文件到软件的安装目录。另外在没有安装MATLAB的计算机上还要安装一个通用的MATLAB的编译器运行时刻库MCR。MCR的安装十分简单,MATLAB提供了相应的安装程序MCRInstaller.exe,只要在软件的安装程序中包括对它的运行安装即可。至此,按上述方法开发的软件就可以在没有安装MATLAB的系统上独立运行。
|
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。