posts - 195, comments - 34, trackbacks - 0, articles - 1

          matlab的混合編程

          Posted on 2007-06-27 22:53 小強摩羯座 閱讀(1093) 評論(1)  編輯  收藏 所屬分類: matalb相關
           
          從一個簡單的例子說起
          2006-12-25 17:21:23
          馬上要考試啦,而且還要寫報告做實驗,可就是打不起精神來準備。突然想起來寫寫blog,這次想寫的是關于matlab混合編程的東西,以便日后用得著的時候可以方便的查看。
           
          關于為什么要進行matlab的混合編程的原因,現在不想去仔細地調查了,哪天有興致了再寫吧。matlab的混合編程范圍也很廣,包括與C,fortran,Basic等各種高級語言的混合編程,我呢,只對C還稍稍有點認識,就寫C的。
           
          matlab與C的混合編程包括在C中調用matlab和在matlab中調用C。先寫在C中調用matlab吧。在C中調用matlab可以使用matlab引擎,也利用matlab編譯器。嗯,先寫利用matlab編譯器的。
           
          關于這個編譯器的介紹,等考完PLD了,再去仔細地調研一下。這篇呢就從一個簡單的例子來講述一下怎么利用matlab的編譯器來進行混合編程。
           
          首先,啟動matlab,編寫一個簡單的函數M文件,myplot.m:
          function myplot()
           
          n = 0:0.01:1;
          y = sin(2*pi*n);
           
          plot(n,y)
           
          NOTE:就目前來說,matlab還只支持函數M文件的編譯,而不支持腳本M文件,所以一定要寫成函數M文件。
           
          寫完M文件之后,必須對文件進行編譯。在編譯之前,必須對編譯器進行配置(這個步驟只需進行一次,下次再用時就不用再進行配置了)。配置使用的命令是mbuild -setup。然后按著提示選擇y/n和123就好了。
          配置完成之后,就可以進行編譯了。編譯使用的命令是mcc。mcc函數可以帶多種參數,關于各個參數的含義以后再說吧。在這里使用:
          mcc -W cpplib:libmyplot -T link:lib myplot.m
           
          Note:這里libmyplot是生成的lib文件的文件名,myplot.m是待編譯的文件。使用這個命令將會生成一序列不同格式的文件,在后面將會利用到。這個過程比較慢,要耐心等待,別以為是程序有問題然后就給關了,呵呵。
           
          這些是用matlab來實現的步驟,下面就要開始用c來調用了。
          先要對vc的預編譯路徑進行設置。我用的是VC++6.0,設置的方法是:
          在tools\options\directions下的show directions for下的組合框選include files項,添加"%matlab\extern\include",再選擇library files項,添加"%matlab\EXTERN\LIB\WIN32\MICROSOFT"。這里%matlab是matlab的安裝路徑,library files項要根據系統平臺及c語言的開發環境來選擇。這個設置跟前面matlab編譯器的設置一樣,只需要設一次就可以了,建立其它的工程時不用現進行設置。
           
          然后可以開始編程了。這里選用MFC編程。先建立一個基于對話框的工程,接受所有黑夜默認的設置。完成后,將前面編譯生成的.ctf,.dll和.lib文件復制到當前工程路徑下。
           
          對生成的對話框做一些改動,去掉自動生成的“確定”及取消“按鈕”及文本(如果你想留著也沒關系啦),添加"Plot"及"Close"按鈕,并添加其響應函數(雙擊按鈕就會生成的)。
           
          在myplotDlg.cpp文件里添加:
          #include myplot.h
           
          在OnInitDialog函數里添加如下:
          // Initialize the MCR
           if (!mclInitializeApplication(NULL,0))
           {
            AfxMessageBox(_T("Could not intialize the application."));
            return TRUE;
           }
           // Initialize the matlab library
           libmyplotInitialize();
           
          在Plot按鈕的響應函數中,添加:
          myplot();
           
          在Close按鈕的響應函數中,添加:
          // Terminate the library
           libmyplotTerminate();
           
           // Terminate the MCR
           mclTerminateApplication();
           
           OnClose();
           
          程序的編寫到這里就OK啦。然后要設置連接選項了。
          Project\settings\category選擇Input,在Object/Library modules添加libmyplot.lib mclmcrrt.lib,對Win32 Release和Win32 Debug都進行相同的設置。
           
          這樣的Over了,編譯,鏈接,運行,就可以看到結果了。不過估計是因為要啟動MCR吧,程序的啟動會很慢,耐心等待哦。
           
          最后說一下關于程序的發布問題。之所以進行混合編程,一個很重要的原因就是想讓一些matlab函數可以脫離matlab平臺運行,為了達到這一目的,在發布程序時,除了發布C生成的可執行文件及matlab編譯生成的.ctf,.dll和.lib文件外,還應該同時發布一個MCRInstaller以便沒有matlab平臺的用戶使用。MCRInstaller的生成方法很簡單,使用下面的函數即可:
          zipfile = buildmcr(dirname)
          該函數將生成MCRInstaller.zip文件,并將該文件保存到dirname指定的路徑下,zipfile返回的是完整的路徑名。
           
          這樣就可以發布程序了。沒有matlab平臺的用戶在使用時,應該先將MCRInstaller.zip解壓到本地的某一路徑下,并將其中的可執行文件所在的路徑(應該是在bin文件夾底下)添加到系統環境變量中。
          Note:添加系統環境變量的方法
          在我的電腦上右鍵,選擇屬性,再選擇高級子菜單,點擊環境變量按鈕,并點擊彈出對話框中系統變量對應的新建按鈕,變量名可以自定義,變量值就是前面得到的路徑。
           
          這樣就徹底地結束了,不過我沒有在沒有matlab平臺的電腦上測試過,哪位測試過的告訴我一下結果。


          Feedback

          # re: matlab的混合編程  回復  更多評論   

          2008-12-19 10:04 by ccx
          你好!你做過獨立發布嗎?好幾天了搞不定,望指點一下哦!
          主站蜘蛛池模板: 江陵县| 灯塔市| 长沙市| 怀来县| 饶阳县| 博罗县| 甘孜| 新民市| 招远市| 江陵县| 南投市| 阆中市| 通化县| 商城县| 东辽县| 乌什县| 明光市| 军事| 湘潭县| 淮北市| 鄱阳县| 琼海市| 金门县| 江孜县| 临沂市| 双牌县| 平安县| 江津市| 揭阳市| 思茅市| 桓仁| 永平县| 宁强县| 涞源县| 长春市| 漳平市| 溧水县| 乐安县| 泰顺县| 顺义区| 晋宁县|