matlab和C C 混合程式設計 Mex

2022-03-13 14:23:30 字數 2465 閱讀 8594

最近的專案需要matlab和c的混合程式設計,經過一番努力終於完成了專案要解決的問題。現在就將mex的一些經驗總結一下,當然只是剛剛開始,以後隨著學習的深入繼續新增。首先講講寫mex的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題--結構到底如何轉換,並且後面會重點說一下自己的程式。

一、mex的結構

先看乙個簡單的程式(該程式儲存在matlab主目錄下名字是mexdemon.cpp,或者在主目錄下新建乙個.cpp檔案):

#include "mex.h"  

//加入標頭檔案,該標頭檔案在vs2010中無法include,但是不影響其在matlab中的編譯,反而在matlab編譯還需要include它

#include using namespace std;

void mexfunction(int nlhs, mxarray *plhs,int nrhs,const mxarray *prhs)

//mexfunction就類似於main函式

}} /*

*ans =

0 5 10 15 20 25

1 6 11 16 21 26

2 7 12 17 22 27

3 8 13 18 23 28

4 9 14 19 24 29

*/

然後對matlab編譯應用程式mex的編譯器進行設定,在命令視窗輸入 mex –setup。 然後跟著步驟走選擇合適的編譯器即可。

設定完編譯器之後在命令視窗輸入mex mexdemon.cpp 進行編譯生成.mexw64檔案,生成之後便可以直接呼叫了,例如本例子可以這樣呼叫,就是直接在命令視窗輸入 a = mexdemon(); 返回值如上。

二、c和matlab的資料結構的轉換

(1)數值的傳遞

matlab -> c++

x = mxgetscalar(prhs[0]);//該函式獲取matlab傳遞過來的數值;
c++ -> matlab

plhs[0] = mxcreatedoublematrix(1,1,mxreal);//

建立返回的矩陣,範圍plhs[0]為mxarray型別

y = mxgetpr(plhs[0]);//

獲取返回plhs[0]的資料位址,其後可以修改y的值就可以返回了

乙個例項(numdemon.cpp):

#include "mex.h"

void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

如下圖在命令視窗編譯:

(2)矩陣的傳入與傳出

關於傳出(c++到matlab, 就是第乙個例子),下面可以再給乙個例子是如何從matlab傳入到c++,看下面這段**:

#include "mex.h"

void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)

for(int i = 0; i < mrows; i++)}}

同樣在命令視窗編譯即可。

(3)字串的傳入與傳出

matlab -> c++ (傳入)

char *input_buf;

input_buf = mxarraytostring(prhs[0]);//使用mxarraytostring將mxarray轉換為c、c++字串

c++ -> matlab (傳出)

char *output_buf;//定義字串快取

size_t buflen = (mxgetm(prhs[0]) * mxgetn(prhs[0])) + 1;//獲取字串長度,mxgetm獲取行數,mxgetn獲取列數

output_buf=mxcalloc(buflen, sizeof(char));//使用mxcalloc分配輸出字串陣列

plhs[0] = mxcreatestring(output_buf);//使用mxcreatestring建立mxarray輸出

mxfree(output_buf);

乙個例項(strdemon.cpp)

#include "mex.h"

void revord(char *input_buf, size_t buflen, char *output_buf)

後面待補充結構體和cell陣列的傳出,暫時還沒遇到這樣的需求。再貼上幾個參考**:

1.2.

C C 和matlab混合程式設計

有些時候使用混合程式設計能夠讓程式更加高效 筆者所使用的matlab軟體為2018a,c 編譯器為microsoft visual c 2017 matlab本身是不帶c c 編譯器的,安裝編譯軟體是必須的 仍然是先從簡單的hello world 開始 首先編寫乙個c 程式 當然也可以c程式 inc...

C C 與Matlab混合程式設計初探

分割線以下為正文 matlab 擁有豐富的功能,程式設計簡單。不過,有些情況下,matlab程式的執行速度比較慢。c c 編譯執行的程式速度比較快,程式設計難度上比matlab要高一些。因此存在一種方案,就是使用matlab實現我們的實驗程式,用c c 來實現matlab程式中比較耗時的部分,從ma...

C C 與Matlab混合程式設計初探

matlab 擁有豐富的功能,程式設計簡單。不過,有些情況下,matlab程式的執行速度比較慢。c c 編譯執行的程式速度比較快,程式設計難度上比matlab要高一些。因此存在一種方案,就是使用matlab實現我們的實驗程式,用c c 來實現matlab程式中比較耗時的部分,從matlab程式中呼叫...