简要回顾一下MATLAB程序编译所经历的大致过程。通过分析MATLAB程序编译发展的历程可以更加明了为什么需要MATLAB编译器、在什么情况下选择MATLAB编译器、应当如何最大限度利用MATLAB编译器?
|
MATLAB出现以后,以其特有的简单方便、功能强大很快拥有了众多的使用者,但是MATLAB也存在一些问题,比如循环执行速度慢、开发和发布应用软件不方便等。这时候,人们自然就会想到是不是可以把MATLAB程序通过编译器编译为C/C++语言以方便其他程序调用。这时候MATLAB编译器需要解决的问题主要有两个:
Ø MATLAB核心库调用的接口函数。
Ø 将用户开发的程序编译为C/C++程序。
Matcom可以将MATLAB程序完全编译为C/C++文件,并且提供一套完整的矩阵运算库。
MATLAB与C/C++混合程序设计思路没有发生本质的变化
(一) MEX文件:在MATLAB开发环境中调用C/C++等外部程序需要借助编译器将C/C++代码编译为MEX文件以后才能实现,其中MEX文件包含有MATLAB解释器可以动态装载和执行的动态链接模块。在windows平台下,MEX文件是以动态链接库的形式存在(根据MATLAB版本不同,扩展名为*.dll ,*.mexw32 ,*mexw64),通过用C/C++语言编写代码,然后通过Matlab编译器将其编译为MEX文件可以完成如下功能。
a) 加速程序的执行速度:将MATLAB程序中运行效率不高的代码(如循环)用C/C++来实现
b) 利用MATLAB作为C/C++语言开发的调试环境:MATLAB在进行数据显示是非常方便的,C/C++语言编写的数值计算程序在其他开发环境中调试时数据显示不方便,因而可以通过MEX文件这种方式在Matlab环境下进行调试。尤其是有大量数据处理的情况下,用MATLAB观察其中间结果是非常方便的。
c) 扩展MATLAB的功能:MATLAB具有强大的矩阵运算能力并且拥有丰富的工具箱,但是在有些方面比较薄弱,比如硬件设备接口操作、图形化程序设计等方面,用户可以利用MEX文件利用C/C++语言扩展Matlab的薄弱环节,以满足设计的需求。
(二) 用户在C/C++调用MATLAB程序可以选择调用MATLAB程序编译后的动态链接库或MATLAB程序编译后的COM组件。这两种方法的执行效率是相同的,动态链接库实现起来比较简单;COM组件实现起来比较复杂,代码的可维护性好,除此之外,C/C++可以通过MATLAB引擎直接执行MATLAB程序,但该方法不能脱离MATLAB环境执行。
(三) MATLAB C++数学库是MATLAB提供的一组封装好的矩阵运算数学库,其使用方法和MATLAB环境中的编写方法十分类似,如果用户用visual C++实现用户界面,有希望寻找一组高效的矩阵运算数学库的话,那么MATLAB c++数学库是一个不错的选择。
无论使用哪种方法,MATLAB的数学结构与C/C++的数学结构之间的相互访问和转换都是混合编程的关键。
评价一下C与C++的各自特点,如果一个程序既需要大量的运算,又要有一个好的用户界面,还需要与其他软件大量交流,应该怎样选择合适的语言。
C是一种结构化语言,重点在于算法和数据结构,C程序的设计首先考虑的是如何通过一个过程(面向过程),对输入运算处理得到输出。
C++首先考虑的是如何构造一个对象模型,让这个对象模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出。
对大规模数值运算,C/C++和Java,.NET 之间没有明显的差异,不过如果涉及向量计算、矩阵运算,可以使用Fortran或MATLAB编写计算组件(如COM)。
大规模用户界面相关的软件可以考虑使用.NET进行开发,而且.NET同COM之间的互操作十分容易,同时.NET对数据的访问的支持也相当好。
COM组件(Componet Object Model)概述:是以组件为发布单元的对象模型,由于COM是建立在二进制级别上的规范,所以组件对象之间的交互规范不依赖于任何特定的开发语言。