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