官术网_书友最值得收藏!

1.9 MATLAB編譯器

利用MATLAB編譯器,不僅可以把M文件編譯成MEX文件(擴(kuò)展名為.dll)或獨(dú)立應(yīng)用的EXE程序(擴(kuò)展名為.exe),減少對語言環(huán)境本身的依賴性,而且可以通過編譯,隱藏自己開發(fā)的算法,防止修改其內(nèi)容。

如果要完成M文件的編譯或MATLAB與C語言的交互,必須建立MATLAB的mex,mcc和mbuild三個(gè)編輯器。mex編譯命令可以將C語言編寫的C文件轉(zhuǎn)換成在MATLAB環(huán)境下能運(yùn)行的各種MATLAB文件的形式。mcc編譯命令可以將MATLAB編寫的M文件轉(zhuǎn)換成為各種形式的C語言或MEX文件。如果是將M文件轉(zhuǎn)換為可執(zhí)行文件,mcc先將M文件轉(zhuǎn)換成Win32格式程序代碼,再利用mbuild命令將其編譯為EXE程序。如果是將M文件轉(zhuǎn)換成MEX文件,mcc先將M文件轉(zhuǎn)換成MEX格式的C代碼,再調(diào)用mex命令將其編譯成MEX文件。

1.9.1 創(chuàng)建MEX文件

利用MATLAB編輯器mex或mcc可把C源代碼文件(擴(kuò)展名為.c)或M文件(擴(kuò)展名為.m)經(jīng)由C源代碼編譯成MEX文件。當(dāng)程序變量為實(shí)數(shù)、或向量化程度較低、或含有循環(huán)結(jié)構(gòu)時(shí),采用MEX文件可提高運(yùn)行速度。另外,MEX文件采用二進(jìn)制代碼生成,能更好地隱藏文件算法,使之免遭非法修改。MEX文件可直接在MATLAB環(huán)境下運(yùn)行,它的使用方法與M文件相同,但同名文件中的MEX文件被優(yōu)先調(diào)用。MEX文件最簡便的創(chuàng)建方法是利用MAT-LAB內(nèi)裝的MEX編輯器(MATLAB Compiler)進(jìn)行轉(zhuǎn)換。

如果系統(tǒng)僅安裝了一個(gè)標(biāo)準(zhǔn)編譯器,在MATLAB環(huán)境下首次利用mex或mcc命令運(yùn)行編輯器時(shí),MATLAB將自動完成配置;而如果系統(tǒng)安裝了多個(gè)標(biāo)準(zhǔn)編譯器,MATLAB將提示用戶指定一個(gè)默認(rèn)編輯器。另外,也可利用mex -setup命令來改變配置。

1.利用C文件創(chuàng)建MEX文件

如果要在MATLAB的當(dāng)前工作目錄中,生成一個(gè)與C源代碼程序同名的MEX文件,只需要在MATLAB命令窗口中輸入以下命令

      >>mex filename.c

以上命令中的filename.c為當(dāng)前工作目錄中將要?jiǎng)?chuàng)建MEX文件的C源代碼程序名。

例1-41】 將MATLAB的自帶文件yprime.c編譯成MEX文件。

首先將子目錄matlab\extern\examples\mex中的yprime.c文件復(fù)制到MATLAB的當(dāng)前工作目錄中,并更名為ex1-41.c,然后在MATLAB命令窗口中輸入以下命令:

      >>mex ex1  41.c

編譯成功后,便可在MATLAB的當(dāng)前工作目錄中,生成一個(gè)MEX文件ex1-41.mexw32(MATLAB 6.5為ex1-41.dll)。此時(shí)在MATLAB命令窗口中輸入以下命令:

      >>y=ex1  41(1,1:4)

結(jié)果顯示:

      y=
        2.0000    8.9685    4.0000    -1.0947

2.利用M文件創(chuàng)建MEX文件

如果要在MATLAB的當(dāng)前工作目錄中,生成一個(gè)與M文件同名的MEX文件,只需要簡單地在MATLAB命令窗口中輸入以下命令:

      >>mcc -x filename.m

以上命令中的filename.m為MATLAB當(dāng)前工作目錄中將要?jiǎng)?chuàng)建MEX文件的M文件名;-x為選項(xiàng),表示由M文件創(chuàng)建MEX文件。在此,mcc指令在把M文件變成C語言源代碼文件之后,會自動調(diào)用mex指令把C源代碼文件轉(zhuǎn)換為MEX文件。如果將選項(xiàng)-x換成-S或-B pcode,則表示用于創(chuàng)建MEX S函數(shù)或P碼文件。

值得注意的是,在將M文件轉(zhuǎn)換成MEX文件時(shí),M文件中的函數(shù)文件和文本文件的轉(zhuǎn)換過程略有不同。

(1)由MATLAB函數(shù)文件生成MEX文件

當(dāng)MATLAB的M文件為函數(shù)文件funname.m時(shí),在MATLAB命令窗口中,利用以下命令可直接在當(dāng)前目錄中生成與函數(shù)文件同名的MEX函數(shù)文件。

      >>mcc -x funname.m

例1-42】 將以下函數(shù)文件ex1-42.m生成MEX文件。

            %ex1  42.m
            function y=ex1  42(x)
            y=3*x+x.^3;

在MATLAB命令窗口中,輸入以下命令:

      >>mcc -x ex1  42.m

編譯成功后,同樣可在MATLAB的當(dāng)前工作目錄中,生成一個(gè)MEX文件ex1-42.dll和其他許多無用的中間文件。為了確保ex1-42.dll文件的正確運(yùn)行,將當(dāng)前目錄中的ex1-42.m文件和中間文件刪除后,在MATLAB命令窗口中輸入以下命令:

      >>x=-1;y=ex1  42(x)

結(jié)果顯示:

      y=
        -4

(2)由MATLAB文本文件生成MEX文件

當(dāng)MATLAB的M文件為文本文件filename.m時(shí),首先要在文本文件的開頭加一行“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

編譯成功后,同樣在當(dāng)前工作目錄中,生成一個(gè)MEX文件ex1-43.dll和其他許多中間文件。將該目錄中的ex1-43.m和無用的中間文件刪除后,在MATLAB命令窗口中輸入命令

      >>ex1  43

結(jié)果顯示:

      c=
        30

注意,編譯器mcc的選項(xiàng)-x在MATLAB 7.5中已經(jīng)不支持了,它僅可用于MATLAB 6.5及以前的版本。因?yàn)镸ATLAB 7.5的JIT加速器已經(jīng)可以把M文件的執(zhí)行效率增加許多,MATLAB 7.5已不應(yīng)用MEX格式來加速程序的執(zhí)行速度了。因此,MATLAB 7.5無法編譯MEX格式的文件。

1.9.2 創(chuàng)建EXE文件

前面介紹的MEX文件雖然編碼形式與M文件不同,但MEX文件仍是只能在MATLAB環(huán)境中運(yùn)行的文件,它與MATLAB其他指令的作用依靠動態(tài)鏈接實(shí)現(xiàn)。MATLAB編輯器mbuild或mcc可使C源代碼文件或M文件經(jīng)由C或C++源代碼生成獨(dú)立的外部應(yīng)用程序(擴(kuò)展名為.exe),即EXE文件。EXE文件可以獨(dú)立于MATLAB環(huán)境運(yùn)行,但是往往需要MATLAB提供的數(shù)學(xué)函數(shù)庫(MATLAB C/C++Math Library)和圖形函數(shù)庫(MATLAB C/C ++Graphics Library)的支持。

如果系統(tǒng)僅安裝有一個(gè)標(biāo)準(zhǔn)C/C ++編輯器,MATLAB將在首次執(zhí)行編譯時(shí)自動完成配置;如果系統(tǒng)安裝了多個(gè)標(biāo)準(zhǔn)編譯器,那么在首次執(zhí)行編譯任務(wù)時(shí),MATLAB將提示用戶指定一個(gè)默認(rèn)編輯器。另外,也可利用命令“mbuild -setup”來改變配置。

獨(dú)立外部程序或完全由M文件轉(zhuǎn)換產(chǎn)生,或完全由C/C++文件轉(zhuǎn)換產(chǎn)生,或由它們的混合文件轉(zhuǎn)換產(chǎn)生,但不能由MEX文件轉(zhuǎn)換得到。

1.利用C文件創(chuàng)建EXE文件

如果要在MATLAB的當(dāng)前目錄中,生成一個(gè)與C源代碼程序同名的EXE文件,只需要在MATLAB命令窗口輸入以下命令

      >>mbuild filename.c

以上命令中的filename.c為將要編譯成EXE文件的C源代碼程序名。

2.利用M文件創(chuàng)建EXE文件

MATLAB在對M文件進(jìn)行轉(zhuǎn)換時(shí),它首先被編譯器翻譯成C/C++源代碼文件,然后自動調(diào)用mbuild命令,對產(chǎn)生的C/C++源代碼文件連同那些本來就是C/C++的源代碼文件一起再進(jìn)行編譯,并鏈接生成最終的可執(zhí)行外部EXE文件。

如果要在MATLAB的當(dāng)前目錄中,生成一個(gè)與M文件同名的EXE文件,只需要在MAT-LAB命令窗口輸入以下命令

      >>mcc -m filename.m           %創(chuàng)建C獨(dú)立應(yīng)用程序

      >>mcc -p filename.m           %創(chuàng)建C++獨(dú)立應(yīng)用程序

以上命令中的filename.m為當(dāng)前目錄中將要編譯成EXE文件的M文件名;選項(xiàng)-m表示產(chǎn)生C語言的可執(zhí)行外部應(yīng)用程序;選項(xiàng)-p表示產(chǎn)生C++語言的可執(zhí)行外部應(yīng)用程序,但此時(shí)要確保系統(tǒng)已經(jīng)安裝了有關(guān)C++編譯器(因MATLAB僅自帶一個(gè)Lcc C編譯器),否則無法正常建立。在此,mcc在把M文件變成C或C++源代碼文件之后,會再自動調(diào)用mbuild指令把C或C++源代碼文件轉(zhuǎn)換為可獨(dú)立執(zhí)行的EXE文件。如果在創(chuàng)建C或C++語言的獨(dú)立應(yīng)用程序時(shí),需要用到圖形函數(shù)庫,則需要利用以下相應(yīng)的命令

      >>mcc -B sgl filename.m      %創(chuàng)建帶繪圖函數(shù)的C獨(dú)立應(yīng)用程序

      >>mcc -B sglcpp filename.m    %創(chuàng)建帶繪圖函數(shù)的C++獨(dú)立應(yīng)用程序

與創(chuàng)建MEX文件類似,在創(chuàng)建EXE文件時(shí),當(dāng)M文件為文本文件filename.m時(shí),同樣首先要在文本文件的開頭加一行“function filename”,然后再利用以上命令進(jìn)行轉(zhuǎn)換。

例1-44】 將以下M文件ex1-44.m創(chuàng)建成獨(dú)立應(yīng)用程序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

編譯成功后,同樣在當(dāng)前目錄中,生成一個(gè)EXE文件ex1-44.exe和一個(gè)有用的ex1 44.ctf文件(MATLAB 6.5及以前版本為bin文件夾),以及其他許多無用的中間文件。利用鼠標(biāo)雙擊ex1-44.exe文件,便可得到以下結(jié)果和如圖1-13所示的正弦曲線。

      c=
        11
主站蜘蛛池模板: 屏东县| 尉氏县| 保德县| 万载县| 凤庆县| 深州市| 广饶县| 汕头市| 会东县| 错那县| 黄大仙区| 平陆县| 河曲县| 华池县| 葵青区| 禹州市| 上栗县| 井陉县| 庆云县| 长汀县| 南汇区| 灵丘县| 宁南县| 长垣县| 呼图壁县| 县级市| 延安市| 同江市| 夏河县| 方城县| 北宁市| 达孜县| 长岭县| 涟源市| 且末县| 佳木斯市| 潞西市| 特克斯县| 高平市| 泸溪县| 新宁县|