最近的專案需要matlab和c的混合程式設計,經過一番努力終於完成了專案要解決的問題。現在就將mex的一些經驗總結一下,當然只是剛剛開始,以後隨著學習的深入繼續新增。首先講講寫mex的一些常規規定,然後我們會重點關注混合程式設計中最難解決資料的問題--結構到底如何轉換,並且後面會重點說一下自己的程式。
一、mex的結構
先看乙個簡單的程式(該程式儲存在matlab主目錄下名字是mexdemon.cpp,或者在主目錄下新建乙個.cpp檔案):
#include "mex.h"然後對matlab編譯應用程式mex的編譯器進行設定,在命令視窗輸入 mex –setup。 然後跟著步驟走選擇合適的編譯器即可。//加入標頭檔案,該標頭檔案在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
*/
設定完編譯器之後在命令視窗輸入mex mexdemon.cpp 進行編譯生成.mexw64檔案,生成之後便可以直接呼叫了,例如本例子可以這樣呼叫,就是直接在命令視窗輸入 a = mexdemon(); 返回值如上。
二、c和matlab的資料結構的轉換
(1)數值的傳遞
matlab -> c++
x = mxgetscalar(prhs[0]);//該函式獲取matlab傳遞過來的數值;c++ -> matlab
plhs[0] = mxcreatedoublematrix(1,1,mxreal);//乙個例項(numdemon.cpp):建立返回的矩陣,範圍plhs[0]為mxarray型別
y = mxgetpr(plhs[0]);//
獲取返回plhs[0]的資料位址,其後可以修改y的值就可以返回了
#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;c++ -> matlab (傳出)input_buf = mxarraytostring(prhs[0]);//使用mxarraytostring將mxarray轉換為c、c++字串
char *output_buf;//定義字串快取乙個例項(strdemon.cpp)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);
#include "mex.h"後面待補充結構體和cell陣列的傳出,暫時還沒遇到這樣的需求。再貼上幾個參考**:void revord(char *input_buf, size_t buflen, char *output_buf)
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程式中呼叫...