MATLAB呼叫C C 函式的方法

2021-06-12 05:54:07 字數 2683 閱讀 7867

已有 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裡面,...