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

本章教程共分為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)

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

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

16.2.2 編寫C語(yǔ)言MEX文件

在了解了C語(yǔ)言MEX文件的基本結(jié)構(gòu),擴(kuò)展名以及MEX函數(shù)庫(kù)函數(shù)和MX函數(shù)庫(kù)函數(shù)后腮猖,在本小節(jié)中鉴扫,首先對(duì)MATLAB編寫C語(yǔ)言MEX文件的環(huán)境進(jìn)行配置,然后通過(guò)兩個(gè)簡(jiǎn)單的MEX文件實(shí)例來(lái)演示C語(yǔ)言MEX文件的編寫澈缺。

1. MEX文件配置

為了使用不同語(yǔ)言坪创,例如C, C++,或者FORTRAN編寫MEX文件,通過(guò)MATLAB應(yīng)用程序接口編譯成MATLAB可執(zhí)行文件姐赡,需要對(duì)MATLAB編譯環(huán)境進(jìn)行配置莱预。成功配置MEX開(kāi)發(fā)環(huán)境需要具備兩個(gè)條件:

  • MATLAB開(kāi)發(fā)環(huán)境和應(yīng)用程序接口(API)組件和MATLAB接口程序編譯器(Compiler);
  • C, C++或者FORTRAN語(yǔ)言的編譯器项滑,比如Visual Studio C++, FORTRAN等不同語(yǔ)言編譯器環(huán)境锁施。

在MATLAB命令行窗口中輸入:

>> mex -setup
Please choose your compiler for building external interface (MEX) files: 

Would you like mex to locate installed compilers [y]/n? y

Select a compiler: 
[1] Lcc C version 2.4.1 in C:\PROGRAM FILES\MATLAB\R2006A\sys\lcc 
[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio 

[0] None 

Compiler: 2

Please verify your choices: 

Compiler: Microsoft Visual C/C++ 6.0 
Location: C:\Program Files\Microsoft Visual Studio 

Are these correct?([y]/n): y

Trying to update options file: 
C:\Documents and Settings\Motor308\Application Data\MathWorks\MATLAB\R2006a\mexopts.bat 
From template:              
C:\PROGRAM FILES\MATLAB\R2006A\BIN\win32\mexopts\msvc60opts.bat

這樣就基本完成了MATLAB編譯器C語(yǔ)言接口的配置。然后可以通過(guò)編寫簡(jiǎn)單的MEX文件來(lái)驗(yàn)證編譯器配置正確與否杖们。

2. MEX編程實(shí)例演示

完成MEX環(huán)境配置后悉抵,就可以編寫簡(jiǎn)單的MEX文件進(jìn)行環(huán)境測(cè)試。首先編寫一個(gè)實(shí)現(xiàn)MATLAB開(kāi)發(fā)環(huán)境中ones(M,N)函數(shù)功能的MEX文件摘完。

/*
 * mexSimpleDemo2.c
*/

#include "mex.h"
int mexSimpleDemo2(double y[], int m_size, int n_size);

void mexFunction(int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
    //變量聲明
    double *y;
    int m,n;
    
    //輸入輸出參數(shù)個(gè)數(shù)檢測(cè)
    if (nlhs != 1)
        mexErrMsgTxt("Error: At least one output parameter is required!");
    if (nrhs > 2)
        mexErrMsgTxt("Error: No more than two input parameters");
            
    //獲取輸入數(shù)組大小
    m = mxGetScalar( prhs[0] );
    n = mxGetScalar( prhs[1] );
    
   //獲取輸出數(shù)組的指針和建立初始值姥饰。
    plhs[0] = mxCreateDoubleMatrix(m,n,mxREAL);
    y = mxGetPr(plhs[0]);
    
    //調(diào)用子函數(shù)
    mexSimpleDemo2(y, m ,n);
    
}

//算法子程序
int mexSimpleDemo2(double *y, int m_size, int n_size)
{
    int i,j;
    for( i = 0; i < m_size; i++)
        for( j = 0; j < n_size; j++)
            *y++ = 1;
    
    return(EXIT_SUCCESS);
}

編譯該程序后,在Matlab命令行窗口中輸入以下命令:

>> mexSimpleDemo2(5,3)      %輸出參數(shù)不匹配孝治,導(dǎo)致錯(cuò)誤
??? Error: At least one output parameter is required!
>> c=mexSimpleDemo2(5,3,6)  %輸入?yún)?shù)不匹配列粪,導(dǎo)致輸入?yún)?shù)檢測(cè)錯(cuò)誤
??? Error: No more than two input parameters
>> c=mexSimpleDemo2(3,4)    %mex文件的正確調(diào)用格式

c =

     1     1     1     1
     1     1     1     1
     1     1     1     1

3. 字符串操作

在上一個(gè)實(shí)例中,可以看到MEX文件的編寫結(jié)構(gòu)清晰谈飒,實(shí)現(xiàn)特定功能的C語(yǔ)言算法子函數(shù)完全采用C語(yǔ)言函數(shù)庫(kù)進(jìn)行岂座,通過(guò)編寫mexFunction函數(shù)接口實(shí)現(xiàn)在MATLAB中調(diào)用C語(yǔ)言函數(shù)。在本實(shí)例中杭措,將演示MEX文件進(jìn)行字符串操作费什,統(tǒng)計(jì)字符串中特定字符的個(gè)數(shù)。

/*
 *  mexSimpleDemo3.c
  */
#include "mex.h"
int mexSimpleDemo3( char *input_buf, int buf_len);

void mexFunction(int nlhs, mxArray *plhs[],
                                 int nrhs, const mxArray *prhs[])
{
    //variables declaration
    char *input_buf;
    int count, buf_len,flag;
    
    //輸出參數(shù)個(gè)數(shù)統(tǒng)計(jì)手素,沒(méi)有輸出參數(shù)鸳址。
    if (nlhs >= 1)
        mexErrMsgTxt("Error: No output parameter is required!");
    //輸入?yún)?shù)類型檢測(cè)瘩蚪,輸入必須為字符串類型。
    if ( mxIsChar(prhs[0]) != 1)
        mexErrMsgTxt("Error: Input must be string!");
    if ( mxGetM(prhs[0]) != 1)
        mexErrMsgTxt("Error: Input must be a row vector!");
    
    //統(tǒng)計(jì)輸入字符串的長(zhǎng)度
    buf_len = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1;
    
    //給輸入字符串分配內(nèi)存空間
    input_buf = mxCalloc(buf_len, sizeof(char));
    flag = mxGetString(prhs[0], input_buf, buf_len);
    
    if( flag != 0)
        mexWarnMsgTxt("Not enough memory space!");
    
    // 調(diào)用字符串統(tǒng)計(jì)子函數(shù)統(tǒng)計(jì)字母s(S)的個(gè)數(shù)
    count = mexSimpleDemo3(input_buf, buf_len);
    mexPrintf("Then number of character s(S) in the input string is %d.",count);
    
}

//字符串統(tǒng)計(jì)子函數(shù)統(tǒng)計(jì)字母s(S)的個(gè)數(shù)子函數(shù)
int mexSimpleDemo3( char *input_buf, int buf_len)
{
    int i, count;
    count = 0;
    for( i = 0; i < buf_len; i++)
        if((*(input_buf + i) == 's')||(*(input_buf + i) == 'S'))
            count ++;
    
    return count;
}

編譯該程序后稿黍,在Matlab命令行窗口中輸入以下命令:

>> mexSimpleDemo3(1)                            %輸入?yún)?shù)類型不匹配疹瘦,導(dǎo)致錯(cuò)誤
??? Error: Input must be string!
>> c=mexSimpleDemo3('This is a simple demo to mex files!')  %輸出參數(shù)個(gè)數(shù)不正確,導(dǎo)致錯(cuò)誤
??? Error: No output parameter is required!
>> mexSimpleDemo3('This is a simple demo to mex files!')    %正確的mex文件調(diào)用格式
Then number of character s(S) in the input string is 4.>>

作者:德特?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)離奇詭異钉嘹,居然都是意外死亡鸯乃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門跋涣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缨睡,“玉大人,你說(shuō)我怎么就攤上這事陈辱〗蹦辏” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵沛贪,是天一觀的道長(zhǎng)陋守。 經(jīng)常有香客問(wèn)我讯屈,道長(zhǎng)倾贰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任甲锡,我火速辦了婚禮媚送,結(jié)果婚禮上中燥,老公的妹妹穿的比我還像新娘。我一直安慰自己塘偎,他們只是感情好疗涉,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吟秩,像睡著了一般咱扣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涵防,一...
    開(kāi)封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天闹伪,我揣著相機(jī)與錄音,去河邊找鬼。 笑死祭往,一個(gè)胖子當(dāng)著我的面吹牛伦意,可吹牛的內(nèi)容都是我干的火窒。 我是一名探鬼主播硼补,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熏矿!你這毒婦竟也來(lái)了已骇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤票编,失蹤者是張志新(化名)和其女友劉穎褪储,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慧域,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤竹,尸身上長(zhǎng)有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
  • 文/蒙蒙 一温峭、第九天 我趴在偏房一處隱蔽的房頂上張望猛铅。 院中可真熱鬧,春花似錦诚镰、人聲如沸奕坟。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)月杉。三九已至,卻和暖如春抠艾,著一層夾襖步出監(jiān)牢的瞬間苛萎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腌歉,地道東北人蛙酪。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翘盖,于是被迫代替她去往敵國(guó)和親桂塞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容