1.9 MATLAB编译器
利用MATLAB编译器,不仅可以把M文件编译成MEX文件(扩展名为.dll)或独立应用的EXE程序(扩展名为.exe),减少对语言环境本身的依赖性,而且可以通过编译,隐藏自己开发的算法,防止修改其内容。
如果要完成M文件的编译或MATLAB与C语言的交互,必须建立MATLAB的mex,mcc和mbuild三个编辑器。mex编译命令可以将C语言编写的C文件转换成在MATLAB环境下能运行的各种MATLAB文件的形式。mcc编译命令可以将MATLAB编写的M文件转换成为各种形式的C语言或MEX文件。如果是将M文件转换为可执行文件,mcc先将M文件转换成Win32格式程序代码,再利用mbuild命令将其编译为EXE程序。如果是将M文件转换成MEX文件,mcc先将M文件转换成MEX格式的C代码,再调用mex命令将其编译成MEX文件。
1.9.1 创建MEX文件
利用MATLAB编辑器mex或mcc可把C源代码文件(扩展名为.c)或M文件(扩展名为.m)经由C源代码编译成MEX文件。当程序变量为实数、或向量化程度较低、或含有循环结构时,采用MEX文件可提高运行速度。另外,MEX文件采用二进制代码生成,能更好地隐藏文件算法,使之免遭非法修改。MEX文件可直接在MATLAB环境下运行,它的使用方法与M文件相同,但同名文件中的MEX文件被优先调用。MEX文件最简便的创建方法是利用MAT-LAB内装的MEX编辑器(MATLAB Compiler)进行转换。
如果系统仅安装了一个标准编译器,在MATLAB环境下首次利用mex或mcc命令运行编辑器时,MATLAB将自动完成配置;而如果系统安装了多个标准编译器,MATLAB将提示用户指定一个默认编辑器。另外,也可利用mex -setup命令来改变配置。
1.利用C文件创建MEX文件
如果要在MATLAB的当前工作目录中,生成一个与C源代码程序同名的MEX文件,只需要在MATLAB命令窗口中输入以下命令
>>mex filename.c
以上命令中的filename.c为当前工作目录中将要创建MEX文件的C源代码程序名。
【例1-41】 将MATLAB的自带文件yprime.c编译成MEX文件。
解 首先将子目录matlab\extern\examples\mex中的yprime.c文件复制到MATLAB的当前工作目录中,并更名为ex1-41.c,然后在MATLAB命令窗口中输入以下命令:
>>mex ex1 41.c
编译成功后,便可在MATLAB的当前工作目录中,生成一个MEX文件ex1-41.mexw32(MATLAB 6.5为ex1-41.dll)。此时在MATLAB命令窗口中输入以下命令:
>>y=ex1 41(1,1:4)
结果显示:
y= 2.0000 8.9685 4.0000 -1.0947
2.利用M文件创建MEX文件
如果要在MATLAB的当前工作目录中,生成一个与M文件同名的MEX文件,只需要简单地在MATLAB命令窗口中输入以下命令:
>>mcc -x filename.m
以上命令中的filename.m为MATLAB当前工作目录中将要创建MEX文件的M文件名;-x为选项,表示由M文件创建MEX文件。在此,mcc指令在把M文件变成C语言源代码文件之后,会自动调用mex指令把C源代码文件转换为MEX文件。如果将选项-x换成-S或-B pcode,则表示用于创建MEX S函数或P码文件。
值得注意的是,在将M文件转换成MEX文件时,M文件中的函数文件和文本文件的转换过程略有不同。
(1)由MATLAB函数文件生成MEX文件
当MATLAB的M文件为函数文件funname.m时,在MATLAB命令窗口中,利用以下命令可直接在当前目录中生成与函数文件同名的MEX函数文件。
>>mcc -x funname.m
【例1-42】 将以下函数文件ex1-42.m生成MEX文件。
%ex1 42.m function y=ex1 42(x) y=3*x+x.^3;
解 在MATLAB命令窗口中,输入以下命令:
>>mcc -x ex1 42.m
编译成功后,同样可在MATLAB的当前工作目录中,生成一个MEX文件ex1-42.dll和其他许多无用的中间文件。为了确保ex1-42.dll文件的正确运行,将当前目录中的ex1-42.m文件和中间文件删除后,在MATLAB命令窗口中输入以下命令:
>>x=-1;y=ex1 42(x)
结果显示:
y= -4
(2)由MATLAB文本文件生成MEX文件
当MATLAB的M文件为文本文件filename.m时,首先要在文本文件的开头加一行“func-tion filename”,然后再在MATLAB命令窗口中,利用以下命令生成与文本文件同名的MEX文件。
>>mcc -x filename.m
【例1-43】 将以下文本文件ex1-43.m生成MEX文件。
%ex1 43.m a=5;b=6;c=a*b
解 首先要将以上文本文件改写为
%ex1 43.m function ex1 43 a=5;b=6;c=a*b
然后再在MATLAB命令窗口中,输入以下命令:
>>mcc -x ex1 43.m
编译成功后,同样在当前工作目录中,生成一个MEX文件ex1-43.dll和其他许多中间文件。将该目录中的ex1-43.m和无用的中间文件删除后,在MATLAB命令窗口中输入命令
>>ex1 43
结果显示:
c= 30
注意,编译器mcc的选项-x在MATLAB 7.5中已经不支持了,它仅可用于MATLAB 6.5及以前的版本。因为MATLAB 7.5的JIT加速器已经可以把M文件的执行效率增加许多,MATLAB 7.5已不应用MEX格式来加速程序的执行速度了。因此,MATLAB 7.5无法编译MEX格式的文件。
1.9.2 创建EXE文件
前面介绍的MEX文件虽然编码形式与M文件不同,但MEX文件仍是只能在MATLAB环境中运行的文件,它与MATLAB其他指令的作用依靠动态链接实现。MATLAB编辑器mbuild或mcc可使C源代码文件或M文件经由C或C++源代码生成独立的外部应用程序(扩展名为.exe),即EXE文件。EXE文件可以独立于MATLAB环境运行,但是往往需要MATLAB提供的数学函数库(MATLAB C/C++Math Library)和图形函数库(MATLAB C/C ++Graphics Library)的支持。
如果系统仅安装有一个标准C/C ++编辑器,MATLAB将在首次执行编译时自动完成配置;如果系统安装了多个标准编译器,那么在首次执行编译任务时,MATLAB将提示用户指定一个默认编辑器。另外,也可利用命令“mbuild -setup”来改变配置。
独立外部程序或完全由M文件转换产生,或完全由C/C++文件转换产生,或由它们的混合文件转换产生,但不能由MEX文件转换得到。
1.利用C文件创建EXE文件
如果要在MATLAB的当前目录中,生成一个与C源代码程序同名的EXE文件,只需要在MATLAB命令窗口输入以下命令
>>mbuild filename.c
以上命令中的filename.c为将要编译成EXE文件的C源代码程序名。
2.利用M文件创建EXE文件
MATLAB在对M文件进行转换时,它首先被编译器翻译成C/C++源代码文件,然后自动调用mbuild命令,对产生的C/C++源代码文件连同那些本来就是C/C++的源代码文件一起再进行编译,并链接生成最终的可执行外部EXE文件。
如果要在MATLAB的当前目录中,生成一个与M文件同名的EXE文件,只需要在MAT-LAB命令窗口输入以下命令
>>mcc -m filename.m %创建C独立应用程序
或
>>mcc -p filename.m %创建C++独立应用程序
以上命令中的filename.m为当前目录中将要编译成EXE文件的M文件名;选项-m表示产生C语言的可执行外部应用程序;选项-p表示产生C++语言的可执行外部应用程序,但此时要确保系统已经安装了有关C++编译器(因MATLAB仅自带一个Lcc C编译器),否则无法正常建立。在此,mcc在把M文件变成C或C++源代码文件之后,会再自动调用mbuild指令把C或C++源代码文件转换为可独立执行的EXE文件。如果在创建C或C++语言的独立应用程序时,需要用到图形函数库,则需要利用以下相应的命令
>>mcc -B sgl filename.m %创建带绘图函数的C独立应用程序
或
>>mcc -B sglcpp filename.m %创建带绘图函数的C++独立应用程序
与创建MEX文件类似,在创建EXE文件时,当M文件为文本文件filename.m时,同样首先要在文本文件的开头加一行“function filename”,然后再利用以上命令进行转换。
【例1-44】 将以下M文件ex1-44.m创建成独立应用程序EXE文件。
%ex1 44.m function ex1 44 a=5;b=6;c=a+b t=0:0.01:2*pi;plot(t,sin(t))
解 在MATLAB命令窗口中,输入以下命令:
>>mcc -B sgl ex1 44.m
编译成功后,同样在当前目录中,生成一个EXE文件ex1-44.exe和一个有用的ex1 44.ctf文件(MATLAB 6.5及以前版本为bin文件夹),以及其他许多无用的中间文件。利用鼠标双击ex1-44.exe文件,便可得到以下结果和如图1-13所示的正弦曲线。
c= 11