本章教程共分為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所示。
? 選擇菜單欄【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所示刽沾。
? 選擇菜單欄【Project】下的【Setting】選項(xiàng)排拷,在【Link】屬性頁中侧漓,添加libeng.lib,libmex.lib监氢,libmx.lib布蔗,libmat.lib庫文件,注意庫文件之間使用空格而不使用逗號(hào)浪腐,否則編譯會(huì)出錯(cuò)幼东,如圖16.3所示膏燃。
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所示谈竿。
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é)果兵罢。
在啟動(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