已有 8167 次閱讀
2010-5-5 13:42
|個人分類:遙感程式開發
|系統分類:科研筆記|
通過matlab將c/c++函式編譯成mex函式,在matlab中就可以呼叫了。
1,首先裝編譯器
matlab裡鍵入mex -setup,選擇你要編譯c++的編譯器
2,寫c++函式
函式的形式必須是
void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)
nlhs:輸出引數個數
plhs:輸出引數列表
nrhs:輸入引數個數
prhs:輸入引數列表
,不過函式名可以隨便取的。注意:儲存的檔名就是將來在matlab中呼叫的函式名,而不是這裡的函式名。
下面給出乙個例子,目的是想擷取陣列的部分元素組成新的陣列
輸入引數3個,目標陣列,擷取的行(向量),擷取的列(向量)
輸出引數2個,擷取後陣列,陣列維數資訊
在函式中展示了如何傳入傳出引數,以及如果從引數列表中取出每乙個引數,matlab資料和c++資料的互相轉換,還有一些輸出函式等。
新建乙個resizearray.cpp檔案(resizearray將作為matlab呼叫的函式名),寫入下面**
#include "mex.h"
//author: 汪幫主 2010.05.05
//matlab呼叫形式: [resizedarr, resizeddims] = resizearray(arr, selrows, sekcols)
void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)
int rownum = mxgetm(prhs[0]);
int colnum = mxgetn(prhs[0]);
double* parr = (double*)mxgetpr(prhs[0]);
//得到選擇的行列資訊
//無論是行向量還是列向量均支援
double* pselrows = (double*)mxgetpr(prhs[1]);
double* pselcols = (double*)mxgetpr(prhs[2]);
int selrowsrownum = mxgetm(prhs[1]);
int selrowscolnum = mxgetn(prhs[1]);
if (selrowsrownum!=1 && selrowscolnum!=1)
int selrowsnum = selrowsrownum*selrowscolnum;
int selcolsrownum = mxgetm(prhs[2]);
int selcolscolnum = mxgetn(prhs[2]);
if (selcolsrownum!=1 && selcolscolnum!=1)
int selcolsnum = selcolsrownum*selcolscolnum;
plhs[1] = mxcreatedoublematrix(2, 1, mxreal);
double* resizeddims = (double*)mxgetpr(plhs[1]);
resizeddims[0] = selrowsnum;
resizeddims[1] = selcolsnum;
plhs[0] = mxcreatedoublematrix(selrowsnum, selcolsnum, mxreal);
double* presizedarr =(double*)mxgetpr(plhs[0]);
//這裡因為matlab中資料得按列優先
#define arr(row,col) parr[(col)*rownum+row]
#define rarr(row,col) presizedarr[(col)*selrowsnum+row]
for(int ri=0; ri
3,編譯c++函式為mex函式
將resizearray.cpp放在matlab當前目錄中,在matlab中輸入mex resizearray.cpp,編譯成功後將會生成resizearray.mexw32
4,呼叫函式
arr=[11:19;21:29;31:39;41:49;51:59;61:69];
selrows=[1 3];
selcols=[2:4 5 9];
[rarr,rdims]=resizearray(arr,rows,cols);
arr中資料:
11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49
51 52 53 54 55 56 57 58 59
61 62 63 64 65 66 67 68 69
rarr中資料:
12 13 14 15 19
32 33 34 35 39
rdims為:25
ok,done!
C C 下呼叫matlab函式操作說明
1.matlab的安裝 連線 安裝32位版本的matlab 在目錄下bin資料夾中有兩個資料夾,選擇win32資料夾下的setup進行安裝 2.matlab mex編譯器配置 安裝完matlab之後,需要設定對應的c 編譯器才能編譯.m檔案生成可供c 呼叫的庫檔案。開啟matlab,在命令列輸入 m...
WPF呼叫Matlab函式方法
有的時候用c 寫影象處理方法,比較費事,不如matlab簡單,但是matlab又做不出wpf那樣的好看介面,怎麼辦呢。今天正好我要實現這個功能,就順便寫個小例子,給需要的人做個借鑑。想要用wpf呼叫matlab 就用到了matlab生成.dll檔案的功能。注 我的vs版本是2013,matlab版本...
matlab練習程式(c c 呼叫matlab)
就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...