matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题。现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加。首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序。

一、Mex的结构

先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在主目录下新建一个.cpp文件):

#include "mex.h"  //加入头文件,该头文件在VS2010中无法include,但是不影响其在matlab中的编译,反而在matlab编译还需要include它#include <vector>using namespace std;void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]) //mexFunction就类似于main函数{//nlhs代表的是输出参数的个数//plhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输出//nrhs代表的是输入参数的个数//prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入vector<vector<double> > array2d;double *z;plhs[0] = mxCreateDoubleMatrix( 5, 6, mxREAL);//第一个输出是一个5*6的矩阵z = mxGetPr(plhs[0]);//获得矩阵的第一个元素的指针array2d.resize(5);int ii = 0;for(int i = 0; i < 5; i++){for(int j = 0; j < 6; j++){z[i*6 + j] = ii; //指针访问矩阵是列优先的,请自己循环程序和分析输出结果ii++;}}}  /**ans =0     5    10    15    20    251     6    11    16    21    262     7    12    17    22    273     8    13    18    23    284     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[]){int x = mxGetScalar(prhs[0]); //将第一个输入参数转为Scalar标量,也就是单数值printf("%d\n", x); //打印double *y; plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); //让第一个输出参数指向一个1*1的矩阵y = mxGetPr(plhs[0]); //获得矩阵的第一个元素的指针*y = 10; //将其赋值为10}

  

如下图在命令窗口编译:


(2)矩阵的传入与传出

关于传出(c++到Matlab, 就是第一个例子),下面可以再给一个例子是如何从matlab传入到c++,看下面这段代码:

#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){double *dataCursor;vector<vector<double> > parms;dataCursor = mxGetPr(prhs[0]); //得到输入矩阵的第一个元素的指针int mrows = mxGetM(prhs[0]);   //获得矩阵的行int ncols = mxGetN(prhs[0]);   //获得矩阵的列printf("%d_%d\n", mrows, ncols);  //打印行和列parms.resize(mrows);  //初始化for(int i = 0; i < mrows; i++){parms[i].resize(ncols);}for(int i = 0; i < mrows; i++){for(int j = 0; j < ncols; j++){parms[i][j] = dataCursor[j * mrows + i]; //拷贝矩阵的元素到vector of vector}}} 

同样在命令窗口编译即可。


(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){mwSize i;if (buflen == 0) return;for(i=0;i<buflen-1;i++)*(output_buf+i) = *(input_buf+buflen-i-2);}void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){char *input_buf, *output_buf;size_t buflen;buflen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1; //因为本程序是翻转字符串,所以输入输出字符串的长度应该一样output_buf=mxCalloc(buflen, sizeof(char)); //申请空间input_buf = mxArrayToString(prhs[0]); //获得输入字符串revord(input_buf, buflen, output_buf); //翻转字符串plhs[0] = mxCreateString(output_buf); mxFree(input_buf);return;}

  

同样编译一下即可。


(4)cell的传入

#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){mwSize cellNdim = mxGetNumberOfDimensions(prhs[0]); //这里介绍两个函数mxGetNumberOfDimensions和mxGetDimensionsconst int *cellColPtr = mxGetDimensions(prhs[0]);//mxGetDimensions: 就是返回一个指针ptr,每一个指针所指向的值是每一个维度的元素个数。例如有矩阵3*2的矩阵,那么*(ptr)为3,*(ptr+1)为2.//mxGetNumberOfDimensions: 返回mxArray的维度。int cellNRow = *(label_dims);int cellNCol = *(label_dims + 1);mxArray *ptr;ptr = mxGetCell(prhs[0], 0); //获取cell的第0个元素,返回一个mxArray指针,第二个参数代表cell中元素的下标mxArray *cellOfCell;cellOfCell = mxGetCell(ptr, 0);    //当然cell里面可以还是cell,那么应该再样写mxArray *cellOfStr;char *chTmp;cellOfStr = mxGetCell(prhs[0], 0); //当然cell里面可以是字符串chTmp = mxArrayToString(cellOfStr);printf("%s\n", chTmp);}

  

后面待补充结构体和cell数组的传出,暂时还没遇到这样的需求。再贴上几个参考网址:

1.http://blog.sina.com.cn/s/blog_9db9f81901013yv2.html

2.http://blog.sina.com.cn/s/blog_80202a090100uhup.html

转载于:https://www.cnblogs.com/Vae1990Silence/p/10112253.html

matlab和C/C++混合编程--Mex (转载)相关推荐

  1. matlab和C/C++混合编程--Mex

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  2. matlab和C/C++混合编程--Mex (六)参数传递

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  3. Matlab与C/C++混合编程接口及应用

    http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html 在参考文献基础上.补充和完善了. Matlab与C/C++混合编程接口及应用 ...

  4. Matlab与C/C++混合编程 (基于Opencv库)

    之前用过基于VS2018 与MATLAB2018a 混合编程(C++特性)(见https://blog.csdn.net/wwwoowww/article/details/83013801),奈何后来 ...

  5. Matlab与C/C++混合编程调用OpenCV

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http:/ ...

  6. matlab与c 接口与混合编程,Matlab与C/C++混合编程接口及应用方法解析

    1 引言 Matlab 是当前应用最为广泛的数学软件,具有强大的数值计算.数据分析处理.系统 分析.图形显示甚至符号运算等功能[1].利用这一完整的数学平台,用户可以快速实现十分 复杂的功能,极大地提 ...

  7. MATLAB和C语言混合编程示例

    MATLAB虽然很好用,尤其在数值运算,图像处理,仿真方面很简洁.方便,但有时间当处理比较大的数据时速度确实有点让人捉急,不过MATLAB提供了和C/C++混合编程的接口,以此兼具二者的优点来缓解这个 ...

  8. 【转】matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件

    转自:matlab与C/C++混合编程--在Windows/Linux上调用Matlab编译的动态库文件_sinat_18131557的博客-CSDN博客 date version comments ...

  9. matlab混合编程 mex,求教:matlab混合编程关于mex内自定义函数的输出

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 matlab与vc混合编程中,定义2个矩阵输入输出.假使文件定义为r.c,用,mex -r.c编译之后,假使输入矩阵为a,b,可是执行s=r(a,b)却只 ...

最新文章

  1. android 默认中文时区,修改android默认系统语言为中文和时区
  2. Office Communication Server(OCS) 2007存档和CDR的部署
  3. 06 / LiveVideoStack主编观察:六岁的Frame.io被收购
  4. Python(4):条件控制
  5. 网管型光纤收发器功能介绍
  6. Android学习笔记:TabHost 和 FragmentTabHost
  7. 在web.config里注册HttpModule
  8. 中标麒麟怎么安装deb包_请教,如何制作中标麒麟系统可用的安装包?
  9. Linux上zk节点在哪存着,Kafka在Zookeeper上的节点信息和查看方式
  10. java执行db2命令_送你一份P6级Java面试题
  11. windows如何设置新建文本文档快捷键
  12. 用友U8库存管理软件,用友U8
  13. 财务oracle ap模块,Oracle ERP EBS R12财务应付AP模块基本业务操作
  14. Java AES/ECB/PKCS5Padding加密和PHP解密的实现
  15. 计算机毕业设计之java+ssm疫情防控志愿者管理系统
  16. 新年新气象,牛年更牛,开始新的征程
  17. 真正卓越的领导者,都有这6大共性
  18. OPTA 7模式测试说明
  19. allegro cadence PCB中出光绘文件遇到database has errors:artwork generation cancled.please run dbdoctor问题的解决办法
  20. 2018年计划和目标

热门文章

  1. php函数 99乘法表,[菜鸟学php] php版自定义函数实现99乘法表
  2. linux rto 参数设置,linux 如何计算RTO值
  3. AcWing 893. 集合-Nim游戏(SG函数)
  4. AcWing 836. 合并集合
  5. android datepicker 监听,Android编程之DatePicker和TimePicke简单时间监听用法分析
  6. 局域网不能远程控制_如何通过Windows自带的局域网远程控制连接两台设备
  7. AI智能内容创作的几个方面
  8. [linux]centOS 7.6 安装ntp
  9. 为什么前端H5工程师工资那么高?
  10. Quartus II调用modelsim ALTEA 的软件使用及问题