关于Matlab的MEX技术 10分钟教会你简单的matlab和C/C++混合编程(mex文件)
10分鐘教會(huì)你簡(jiǎn)單的matlab和C/C++混合編程(mex文件)
標(biāo)簽: matlabmexcc++ 2015-05-07 18:40 379人閱讀 評(píng)論(0) 收藏 舉報(bào) 本文章已收錄于: 分類: Matlab(4) 作者同類文章X版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
最近要用matlab提取視頻的特征,數(shù)據(jù)量很大,程序跑起來(lái)很慢,于是把其中一個(gè)模塊改為用C語(yǔ)言來(lái)實(shí)現(xiàn)。我在這里也記錄一下自己的一些心得。
我用的編譯器是matlab自帶的Lcc-win32 C 2.4.1編譯器,好處是可以不依賴高級(jí)編譯器(如VS、GCC),保證程序只要有matlab即可運(yùn)行;缺點(diǎn)是只能用C寫(xiě),不能使用C++的庫(kù)(比如vector、OpenCV)。所以以下這篇文章只適用于針對(duì)矩陣、數(shù)組(不包括字符串string、元胞cell)的簡(jiǎn)單的mex文件編寫(xiě)。
用Lcc編譯器編寫(xiě)mex文件的幾個(gè)注意事項(xiàng):
1、注釋不能有中文,否則報(bào)錯(cuò):Specified export _mexFunction is not defined
2、所有變量定義必須在函數(shù)最前面完成,變量沒(méi)有定義完,不可以執(zhí)行其他操作,否則報(bào)錯(cuò):illegal statement termination
下面是一個(gè)計(jì)算矩陣a-b的例子,
其中mexFunction是默認(rèn)函數(shù)名,不用修改,因?yàn)閙atlab調(diào)用的時(shí)候用的是mex的文件名,而不是函數(shù)名。
nlhs代表的是輸出參數(shù)的個(gè)數(shù)
plhs是一個(gè)指針數(shù)組,里面的指針指向mxArray類型,每一個(gè)指針指向一個(gè)輸出
nrhs代表的是輸入?yún)?shù)的個(gè)數(shù)
prhs是一個(gè)指針數(shù)組,里面的指針指向mxArray類型,每一個(gè)指針指向一個(gè)輸入
[cpp] view plaincopyprint?
簡(jiǎn)單總結(jié)一下幾個(gè)要點(diǎn):
mex文件的編寫(xiě)可以分為三個(gè)步驟,數(shù)據(jù)傳入,數(shù)據(jù)處理,數(shù)據(jù)導(dǎo)出
1、傳入矩陣用mxGetPr,傳入數(shù)值用mxGetScalar
2、獲取2維矩陣維度用mxGetM,mxGetN,C模塊無(wú)法同時(shí)獲得3維矩陣的三個(gè)維度,維度需要自己手動(dòng)傳遞
(此處有誤,可以用函數(shù)mxGetDimensions: 就是返回一個(gè)指針ptr,每一個(gè)指針?biāo)赶虻闹凳敲恳粋€(gè)維度的元素個(gè)數(shù)。例如有矩陣3*2的矩陣,那么*(ptr)為3,*(ptr+1)為2,如果是3維矩陣,只需要訪問(wèn)*(ptr+2)。參考文章中的第四節(jié)有詳細(xì)描述)
3、數(shù)據(jù)在內(nèi)存上都是連續(xù)的,訪問(wèn)的時(shí)候按列的順序訪問(wèn)
4、數(shù)據(jù)傳出用mxCreateDoubleMatrix,先創(chuàng)建一個(gè)double類型的指針用來(lái)存放要導(dǎo)出的數(shù)據(jù),然后再拷貝到plhs[i]對(duì)應(yīng)的指針上
參考文章:matlab和C/C++混合編程--Mex
- 上一篇leetcode中Single Number II的一個(gè)通用解法
- 下一篇Python2.7寫(xiě)入中文數(shù)據(jù)進(jìn)sqlite3報(bào)錯(cuò)
關(guān)于Matlab的MEX技術(shù)??
2008-03-30 15:13:58|??分類: CAE |??標(biāo)簽: |舉報(bào) |字號(hào)大中小?訂閱
用微信??“掃一掃”
將文章分享到朋友圈。
用易信??“掃一掃”
將文章分享到朋友圈。
下載LOFTER 我的照片書(shū)??|
MEX文件的功能主要包括三個(gè)方面(參見(jiàn)文獻(xiàn)[1]),這里主要是將Matlab作為C和Fortran代碼的調(diào)試器。以下工作的軟件平臺(tái)為:
l??????? Microsoft.Visual.Studio.2005.Professional.Edition.DVD
l??????? Intel.Visual.Fortran.Compiler.Pro.v9.1.032
l??????? Matlab 7.5.0(R2007b)
以Matlab自帶的timestwo.c文件為例(C:\Program Files\MATLAB\R2007b\extern\examples\refbook\timestwo.c)說(shuō)明MEX的工作流程:用戶在Matlab命令行(主界面中的Command Window)下輸入:
mex timestwo.c
如果編譯順利完成,同文件夾下會(huì)出現(xiàn)一個(gè)名為“timestwo.mexw32”的文件(Matlab版本為R2007b),再在Matlab命令行下輸入:
timestwo(5.5)
輸出為:
ans=
11
表示這個(gè)函數(shù)計(jì)算結(jié)果正確。要注意C文件的文件名必須是算法函數(shù)的函數(shù)名(這里二者都是timestwo)(這一條似乎不必要)。
制作C-MEX文件的具體步驟:
1.????? 修改原C代碼。
原算法函數(shù)不需要修改,但需要新增一個(gè)名為mexFunction的函數(shù),另外在文件頭部增加“#include "mex.h"”。工作量體現(xiàn)在寫(xiě)mexFunction函數(shù)上。當(dāng)用戶輸入“timestwo(5.5)”時(shí),Matlab首先進(jìn)入這個(gè)函數(shù),這個(gè)函數(shù)再調(diào)用原算法函數(shù),給出答案。因此對(duì)用戶輸入、輸出格式是否正確的檢驗(yàn)是在該函數(shù)中完成的。另外可以看到,原C函數(shù)格式是void fun(y,x),但在Matlab中使用時(shí)格式是y=fun(x),這說(shuō)明mexFunction函數(shù)對(duì)輸入、輸出格式可以自由定義。詳細(xì)的寫(xiě)法參見(jiàn)文獻(xiàn)[1]第4.3節(jié)。
2.????? 在Matlab中將C編譯為MEX文件(如前文所述)。
3.????? 使用這個(gè)MEX文件(如前文所述)。另外只要這個(gè)timestwo.mexw32文件在當(dāng)前目錄下,關(guān)閉Matlab后重新啟動(dòng)仍可以直接使用timestwo函數(shù)。
如果要編譯Fortran文件,先用mex –setup將編譯器改為Fortran的編譯器,然后用同樣的方法編譯即可。
參考文獻(xiàn):
[1] 楊高波.精通matlab7.0混合編程.電子工業(yè)出版社,2006
用微信??“掃一掃”
將文章分享到朋友圈。
用易信??“掃一掃”
將文章分享到朋友圈。
喜歡 推薦 0人??|? 轉(zhuǎn)載
總結(jié)
以上是生活随笔為你收集整理的关于Matlab的MEX技术 10分钟教会你简单的matlab和C/C++混合编程(mex文件)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 几个常用的视频分析工具
- 下一篇: 深度学习之卷积神经网络(Convolut