在这里记录一下自己的挖坑、填坑过程。从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文件