很多情況下,機器學習的演算法都是在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中,函式的輸入...