MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(4)

本章教程共分為7篇進(jìn)行闡述:
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(1)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(2)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(3)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(4)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(5)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(6)
MATLAB編程與應(yīng)用系列-第16章 外部接口技術(shù)(7)

本系列教程來源于出版書籍《基于MATLAB編程基礎(chǔ)與典型應(yīng)用書籍》,如涉及版權(quán)問題,請(qǐng)聯(lián)系:156204968@qq.com鬓催。 出版社:人民郵電出版社, 頁數(shù):525走趋。

本系列教程目前基于MATLABR2006a爹耗,可能對(duì)于更高級(jí)版本的功能和函數(shù)有差異存淫,教程中如有問題荤堪,請(qǐng)聯(lián)系:156204968@qq.com

16.4 MATLAB引擎技術(shù)

MATLAB引擎技術(shù)主要在工作環(huán)境中安裝了MATLAB應(yīng)用程序的前提下實(shí)現(xiàn)其他語言調(diào)用MATLAB函數(shù)合陵,這種技術(shù)一方面可以保持C,C++和FORTRAN語言的運(yùn)算速度快的特點(diǎn)澄阳,同時(shí)可以在C拥知,C++和FORTRAN語言中嵌入復(fù)雜的數(shù)學(xué)分析函數(shù),比如信號(hào)處理函數(shù)碎赢,工程優(yōu)化函數(shù)低剔,F(xiàn)FT變換函數(shù)等,減少了C揩抡,C++和FORTRAN編程的困難户侥。MATLAB引擎技術(shù)主要應(yīng)用于以下幾個(gè)方面:

  • 在特定的應(yīng)用場(chǎng)合下,需要采用C峦嗤,C++或者FORTRAN語言進(jìn)行快捷實(shí)時(shí)的運(yùn)算蕊唐,但是應(yīng)用環(huán)境需要大量的數(shù)學(xué)分析和運(yùn)算,此時(shí)烁设,可以在C替梨,C++和FORTRAN語言中嵌入MATLAB函數(shù),調(diào)用MATLAB引擎装黑。

  • 對(duì)于一些信號(hào)分析系統(tǒng)副瀑,數(shù)據(jù)采集處理系統(tǒng),前臺(tái)需要豐富的人機(jī)接口界面恋谭,后臺(tái)需要做大量的數(shù)據(jù)分析處理糠睡,那么此時(shí)可以很好地利用MATLAB引擎。前臺(tái)可以使用C疚颊,C++和FORTRAN語言編寫操作界面狈孔,而后臺(tái)則使用MATLAB引擎,直接調(diào)用MATLAB數(shù)學(xué)函數(shù)庫材义,一方面減少C均抽,C++和FORTRAN語言編寫相關(guān)數(shù)學(xué)算法的復(fù)雜度,保證了數(shù)學(xué)分析函數(shù)的可靠性其掂,同時(shí)也極大縮短了應(yīng)用程序開發(fā)周期油挥。

16.4.1 Visual C++中調(diào)用MATLAB引擎配置

在Visual C++環(huán)境中調(diào)用MATLAB引擎,首先需要對(duì)Visual C++環(huán)境進(jìn)行配置款熬,按照以下步驟進(jìn)行MATLAB引擎環(huán)境配置深寥。
? 運(yùn)行Microsoft Visual C++,在菜單欄【File】下選擇新建一個(gè)工程文件贤牛,選擇【New】翩迈,點(diǎn)擊【Project】屬性頁,選擇【W(wǎng)in32 Console Application】盔夜,給出工程文件名稱负饲,如圖16.1所示。


圖16.1.新建Win32 Console Application工程項(xiàng)目png

? 選擇菜單欄【Tools】下的【Options】喂链,在【Directories】屬性頁下返十,設(shè)置相關(guān)的Include文件路徑,Libray文件路徑和Executable文件路徑椭微。Inlcude文件路徑設(shè)置為%matlabroot%\extern\include洞坑,其中%matlabroot%為讀者計(jì)算機(jī)中MATLAB應(yīng)用程序的安裝根目錄,Library文件路徑設(shè)置為%matlabroot%\extern\lib\win32\microsoft蝇率, Executable文件路徑設(shè)置為%matlabroot%\bin\win3迟杂,如圖16.2所示刽沾。

圖16.2.Visual C++中包含文件,庫文件路徑設(shè)置png

? 選擇菜單欄【Project】下的【Setting】選項(xiàng)排拷,在【Link】屬性頁中侧漓,添加libeng.lib,libmex.lib监氢,libmx.lib布蔗,libmat.lib庫文件,注意庫文件之間使用空格而不使用逗號(hào)浪腐,否則編譯會(huì)出錯(cuò)幼东,如圖16.3所示膏燃。


圖16.3.Visual C++中Link選項(xiàng)設(shè)置png

16.4.2 主要的MATLAB引擎函數(shù)

MATLAB的應(yīng)用程序接口(API)函數(shù)庫的Engine函數(shù)庫包含了許多引擎操作的函數(shù)摹察,這些函數(shù)以Eng作為前綴奶躯,同MEX函數(shù)庫和MX函數(shù)庫相同,通過前綴來表明函數(shù)所在的API函數(shù)庫特漩。表16.5所示為常用的C語言Engine函數(shù)庫函數(shù)功能描述隔盛。表16.6所示為常用的FORTRAN語言Engine函數(shù)庫函數(shù)。

表16.5 常用的C語言Engine函數(shù)庫函數(shù)

函數(shù)名 功能描述
engOpen 啟動(dòng)MATLAB引擎
engClose 關(guān)閉MATLAB引擎
engGetVariable 從MATLAB引擎中獲取MATLAB變量
engPutVariable 將MATLAB變量傳遞給MATLAB引擎
engEvalString 執(zhí)行MATLAB字符串命令
engOutPutBuffer 創(chuàng)建一個(gè)MATLAB緩沖區(qū)來存儲(chǔ)MATLAB的文本輸出
engSetVisible 設(shè)置顯示或者隱藏MATLAB引擎

表16.6 常用的FORTRAN語言Engine函數(shù)庫函數(shù)

函數(shù)名 功能描述
engOpen 啟動(dòng)MATLAB引擎
engClose 關(guān)閉MATLAB引擎
engGetVariable 從MATLAB引擎中獲取MATLAB變量
engPutVariable 將MATLAB變量傳遞給MATLAB引擎
engEvalString 執(zhí)行MATLAB字符串命令
engOutPutBuffer 創(chuàng)建一個(gè)MATLAB緩沖區(qū)來存儲(chǔ)MATLAB的文本輸出

16.4.3 實(shí)例演示

在了解MATLAB引擎相關(guān)函數(shù)和Visual C++環(huán)境配置后拾稳,在本小節(jié)中將通過兩個(gè)實(shí)例分別演示在MATLAB環(huán)境下使用MEX命令編譯Engine函數(shù)和在Visual C++環(huán)境下編譯運(yùn)行Engine函數(shù)吮炕。

1. 使用MEX文件編譯Engine函數(shù)
在MATLAB安裝程序的路徑下,提供了一些Engine函數(shù)的演示访得,讀者可以打開文件查看Engine文件編寫的基本結(jié)構(gòu)和方法龙亲。首先拷貝C:\Prgoram Files\MATLAB\R2006a\extern\examples\eng_mat\engwindemo.c文件到當(dāng)前MATLAB的工作窗口中,或者直接打開MATLAB悍抑,在MATLAB命令行窗口中輸入以下命令:

demofile = [matlabroot '\extern\examples\eng_mat\engwindemo.c'];
copyfile(demofile, '.');

通過which命令可以看到engwindemo.c文件已經(jīng)拷貝到當(dāng)前路徑下鳄炉,然后選擇編譯屬性文件,在MATLAB命令行窗口中輸入以下命令:

optsfile = [matlabroot '/bin/engopts.sh'];
mex('-f', optsfile, 'engdemo.c');

或者直接使用以下的MATLAB命令行命令:

mex('-f', [matlabroot  '\bin\win32\mexopts\lccengmatopts.bat'], ‘engwindemo.c’);

編譯成功后搜骡,可以看到在MATLAB的當(dāng)前工作窗口中出現(xiàn)了一個(gè)engwindemo.exe可執(zhí)行文件拂盯,在MATLAB命令行窗口中輸入:

!engwindemo

通過!操作符,可以在MATLAB的命令行窗口中執(zhí)行.exe文件记靡,文件運(yùn)行后的結(jié)果如圖16.4所示谈竿。


圖16.4.程序運(yùn)行結(jié)果png

2. 在Visual C++中編譯運(yùn)行MATLAB Engine
按照16.4.1節(jié)中Visual C++調(diào)用MATLAB引擎的配置方法,對(duì)VC環(huán)境進(jìn)行配置摸吠,配置成功后空凸,建立工程項(xiàng)目文件,就可以編譯運(yùn)行MATLAB引擎寸痢。實(shí)例matlabEngDemo.c為一個(gè)簡單的調(diào)用MATLAB應(yīng)用實(shí)例呀洲。

/*
 *  matlabEngDemo.c
*/
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//包含engine.h頭文件或者精確列出文件所在,讀者根據(jù)Matlab安裝路徑修改即可
//  #include <C:\Program Files\MATLAB\R2006a\extern\inlcude\engine.h>
#include "engine.h"
int main(void)
{
    Engine *ep;
    mxArray *temperatureValue;
    double tempValue[]={0,4,6,10,12,16,22,26,30};
    int length;
    
    //開啟Matlab引擎 Engine
    if( !(ep = engOpen(NULL)) )
    {
        //MatlabEngDemo.c為保存的文件名
        MessageBox( (HWND)NULL, (LPSTR)"Can't start MATLAB engine",
                    (LPSTR)"matlabEngDemo.c", MB_OK);
        exit(-1);
    }
    
    //如果正常開啟Matlab引擎,則調(diào)用引擎函數(shù)
    length = sizeof(tempValue)/sizeof(double);
    //初始化mxArray變量temperatureValue
    temperatureValue = mxCreateDoubleMatrix(1, length, mxREAL);
    //將tempValue的數(shù)值拷貝給temperatureValue
    memcpy( (void *)mxGetPr(temperatureValue), (void *) tempValue, length * sizeof(double));
    //將變量導(dǎo)入工作窗口Workspace中
    engPutVariable(ep, "Temperature", temperatureValue);
    //以下利用engEvalString函數(shù)調(diào)用Matlab命令
    engEvalString(ep, "Density = -0.256 * Temperature.^2 + 6.16 * Temperature - 33.9;");
    engEvalString(ep, "plot(Temperature, Density,'r-');");
    engEvalString(ep, "title('Density vs. Temperature curve');");
    engEvalString(ep, "xlabel('Temperature');");
    engEvalString(ep, "ylabel('Density');");
    engEvalString(ep, "grid on;");
    //釋放內(nèi)存空間
    mxDestroyArray(temperatureValue);
    return 0;
}

編譯運(yùn)行程序后道逗,可以得到如圖16.5所示的運(yùn)行結(jié)果兵罢。


圖16.5.程序運(yùn)行結(jié)果png

在啟動(dòng)的MATLAB命令行窗口中。使用whos命令滓窍,查看當(dāng)前工作窗口中的變量卖词,結(jié)果如下所示:

>> whos
  Name              Size                    Bytes  Class
  Density           1x9                        72  double array
  Temperature       1x9                        72  double array
Grand total is 18 elements using 144 bytes

作者:德特?cái)?shù)據(jù)
聯(lián)系方式:156204968@qq.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贰您,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拢操,老刑警劉巖锦亦,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異令境,居然都是意外死亡杠园,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門舔庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抛蚁,“玉大人,你說我怎么就攤上這事惕橙∏扑Γ” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵弥鹦,是天一觀的道長肚逸。 經(jīng)常有香客問我,道長彬坏,這世上最難降的妖魔是什么朦促? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮栓始,結(jié)果婚禮上务冕,老公的妹妹穿的比我還像新娘。我一直安慰自己幻赚,他們只是感情好禀忆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著落恼,像睡著了一般油湖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上领跛,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天乏德,我揣著相機(jī)與錄音,去河邊找鬼。 笑死喊括,一個(gè)胖子當(dāng)著我的面吹牛胧瓜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郑什,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼府喳,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蘑拯?” 一聲冷哼從身側(cè)響起钝满,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎申窘,沒想到半個(gè)月后弯蚜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剃法,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年碎捺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贷洲。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡收厨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出优构,到底是詐尸還是另有隱情诵叁,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布钦椭,位于F島的核電站黎休,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玉凯。R本人自食惡果不足惜势腮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漫仆。 院中可真熱鬧捎拯,春花似錦、人聲如沸盲厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗浩。三九已至建芙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂扼,已是汗流浹背禁荸。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工右蒲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赶熟。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓瑰妄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親映砖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子间坐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361