如何实现matlab与c/c++混编

来源:互联网 发布:oa系统java源码 知乎 编辑:程序博客网 时间:2024/05/21 22:22

很多情况下,机器学习的算法都是在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[]) {     if (nrhs != 3)    {        mexErrMsgTxt("参数个数不正确!");    }        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)    {        mexErrMsgTxt("行参数不正确!");    }    int selRowsNum = selRowsRowNum*selRowsColNum;            int selColsRowNum = mxGetM(prhs[2]);    int selColsColNum = mxGetN(prhs[2]);    if (selColsRowNum!=1 && selColsColNum!=1)    {        mexErrMsgTxt("列参数不正确!");    }    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<selRowsNum; ri++)    {     for(int ci=0; ci<selColsNum; ci++)     {      RARR(ri,ci)=ARR((int)pSelRows[ri]-1,(int)pSelCols[ci]-1);     }    }        mexPrintf("OK!/n"); }
4.编译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);

结果:



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家里门钥匙丢了怎么办 合租朝北晒衣服怎么办 卧室门钥匙丢了怎么办 邻居在我家防盗窗上凉被子怎么办 有钥匙打不开门怎么办 白色腈纶衣服洗完发黄怎么办 在部队有人整你怎么办 老公掉粪坑了你怎么办图片 好久没跑步腿疼怎么办 跑1000米要5分钟怎么办 孩子眼睛近视加散光怎么办 在部队混的差怎么办 2岁宝宝走路踮脚怎么办 宝宝走路膝盖弯曲不直怎么办 做了蛙跳大腿疼怎么办 跳完蛙跳腿疼怎么办 腿受凉了疼怎么办偏方 鸭子步蛙跳后腿疼怎么办 戴墨镜鼻子会红怎么办 校服黑色裙子染色了怎么办 新警培训时怀孕怎么办? 大学生欠了网贷怎么办? 车侧面底盘被刮怎么办 军人家属被打没人处理怎么办 孩子字写的难看怎么办 企业k宝锁死了怎么办 建行信用卡密码忘了怎么办 主卧对着卫生间怎么办 不会画农场的画怎么办 泰迪骨折了怎么办护理 狗狗的腿骨折了怎么办 狗狗摔了一下腿瘸了怎么办 狗狗前腿摔瘸了怎么办 狗摔跤腿瘸了怎么办 小狗的前腿弯了怎么办 两周的小狗缺钙怎么办 狗腿关节断了怎么办 五岁儿童抵抗力差怎么办 3岁儿童抵抗力差怎么办 四岁儿童抵抗力差怎么办 我孩子和我相冲怎么办