您的位置:首页 > 编程语言 > MATLAB

Matlab调用C++代码的具体mex实现详解

2017-11-21 11:25 1931 查看
在这里记录一下自己的挖坑、填坑过程。从mex环境到与成功调用

在具体的实现中,由于matlab具有很强的矩阵运算能力。而对于处理太多的循环结构运算却显得很吃力。所以在具体的实现中,我们可以在Matlab中调用其他语言的程序来达到最高效率的实现。这里我主要是是matlab来调用写好的C++代码为例。当然这也完全使用C语言的代码调用实现。

一、首先,我们需要有自己的编程环境,我的是matlab2017+MinGW-w64 C/C++ 编译器。由于自己的VS2015环境不能被matlab识别。(原因多半是Matlab和VS2015的 安装顺序有关:先安装VS之后再安装Matlab)。关于Matlab的安装这里就不赘述,百度自己解决。

1.MinGW-w64 C/C++编译器的安装,在matlab中虽然附加功能管理器可以安装,但是速度慢的惊人。我们可以直接到网上下载安装。这个TDM-GCC-64’搜索下载去吧!记得w64需要5.3的版本才能在matlab2017B中支持。(这里可以用5.3的安装文件来 覆盖TDM-GCC-64’文件达到)

2.安装之后重启Matlab,进入之后在命令行中输入mex -setup安装编译器,这时默认是C的编译环境。可选择mex -setup C++的选项;

以上就完成了环境的搭建配置。这一过程问题很多。慢慢摸索。

二、以下是我们的关键部分,对 C++代码的重写mex主函数入口(mexfunction)重点**

mex调用C++代码的关键过程有重写原本的main函数,改为mexfunction();该函数是matlab调用的主要入口。如果不重写 会报错如下:LINK : error LNK2001: 无法解析的外部符号 mexFunction



该主函数的形式如下:

**“`

include “mex.h”

void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )

{

}

必须添加include行的“”mex.h“”
四个参数分别用来输出和输入数据: nlhs(left hand side) 是输出参数个数,plhs 是输出参数指针;nrhs (right hand side)是输入参数个数,prhs 是输入参数指针。(想象成一个赋值等式:a = b+c)b和c是需要输入的自变量位于右边
注意: 对输出和输入参数的操作都是通过指针的方式进行的。
**操作输入数据**
对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。如:


double *M;

int m,n;

//指针指向第一个参数的数据地址

M = mxGetPr(prhs[0]);

m = mxGetM(prhs[0]);//获取行

n = mxGetN(prhs[0]);//获取列

**操作输出数据
对于输出数据,需要首先用专门的mex函数分配内存空间,如:**


plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的实矩阵

同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如


double *A;

A = mxGetPr(plhs[0]);

**三、下面以一个网上的例子来说明**


include “mex.h”

void timestwo_alt(double *y, double x)

{

*y = 2.0*x;

}

void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )

{

double *M;

int m,n; //指针指向第一个参数的数据地址

M = mxGetPr(prhs[0]);

m = mxGetM(prhs[0]);

n = mxGetN(prhs[0]);

plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的实矩阵,分配内存空间
double *A;
A = mxGetPr(plhs[0]);

timestwo_alt(A,*M);     //调用并直接赋值到指针指向的输出变量


}

“`

MEX的编译

如编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mex timestwoalt.c生成一个名为timestwoalt.mexw64的MEX文件

MEX的编译编辑

如编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mex timestwoalt.c生成一个名为timestwoalt.mexw32的MEX文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab c++ mex mexfunctio