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