如何實現matlab與c c 混編

2021-07-09 04:26:40 字數 2556 閱讀 7129

很多情況下,機器學習的演算法都是在matlab下實現的。當然我發現現在很多也是用python寫的。這些其實都不重要。

師兄經常抱怨cnn+dpm在matlab下實現一張圖的行人檢測速度實在是太慢。採取了c和matlab的混編。

今天我們就來看看究竟怎麼混編的。其實說到底就是一維指標!

1.首先安裝編譯器。

在matlab裡輸入mex -setup,找到你電腦上裝的編譯器。我的是vs2010

2.編寫c/c++函式

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

其中:nlhs:輸出引數的個數

plhs:輸出引數的列表

nrhs:輸入引數的個數

prhs:輸入引數的列表

注意:這邊函式名隨便取的,不過儲存的檔名就是在matlab裡要呼叫的函式名。

3.例子:目的是想擷取陣列的部分元素組成新的陣列

輸入引數3個,目標陣列,擷取的行(向量),擷取的列(向量)

輸出引數2個,擷取後陣列,陣列維數資訊

在函式中展示了如何傳入傳出引數,以及如果從引數列表中取出每乙個引數,matlab資料和c++資料的互相轉換,還有一些輸出

函式等。

在桌面上新建resizearray.cpp檔案(右擊新建文字文件)

寫入:

#include "mex.h" 

//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; ri4

.編譯c/c++函式為mex函式

將matlab當前目錄設定為桌面,在matlab中輸入mex resizearray.cpp,編譯成功後將會生成resizearray.mexw64

mexw32還是mexw64取決於你的作業系統是32還是64的。

5.在matlab裡呼叫函式

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);

結果:

vc與matlab混編之引擎

include stdafx.h include include engine.h include matrix.h include math.h using namespace std void main engine ep if ep engopen null cout can not star...

c c 混編實現查詢本地IP位址

一 思路 1 要想得到本地ip位址,可以通過本機名來查詢,所以首先得得到本機名。2 牽涉到ip位址,首先想到牽涉到網路協議,因此得載入套接字協議,所以先使用wsastartup函式完成對winsock服務的初始化。二 步驟 三 實現程式的模組化 1 包含檔案工作 include include in...

matlab 與 VC 混編函式引數傳遞 1

關於在c 程式中呼叫matlab編譯產生的動態鏈結庫。具體的問題是在 呼叫dll中函式時傳遞引數。我們知道,matlab可以把m 編譯成兩種dll,分別是c語言介面和c 語言介面的dll。問題是關於呼叫 c 介面的dll中的函式,所以這裡我們就以這種dll為例來介紹。在c 介面的dll中,函式的輸入...