MATLAB - VS2017 的MEX开发

写在前面

  • 关于mex, mex类似于DLL,所以可以用C, C++等语言编写,同样的在MATLAB上也可以生成。

  • 在MATLAB上编写MEX适用于那些已经完成了单步调试后的C函数模块,因为MATLAB无法对MEX的源文件也就是C函数进行调试,只会在编译的时候对一些语法错误进行检查,但是对于诸如数组越界之类的内存泄漏问题,MATLAB则无法进行检查。出现这类问题基本就是强退。因此,最好将C函数模块在VS下调试完成后再利用MATLAB进行后续结果分析,特别是涉及到一些数据处理,比如作图,拟合之类

  • 利用VS完成MEX的编写,需要进行一些配置,比如添加头文件,相关的依赖项等。

利用MATLAB编写MEX

1.编译环境设置,选择需要的C/C++编译器

mex -setup

2.编写MEX

#include "mex.h"
void mexFunction(
        int nlhs,
        mxArray *plhs[],
        int nrhs,
        const mxArray *prhs[]){
            
        }

在mexFunction函数中,会涉及到输入数据的操作,利用mxGetPr得到数据的指针地址。mxGetM和mxGetN会返回矩阵的行和列(整数)。另外MATLAB的矩阵存储顺序是“从上到下,从左到右”。即A(i,j) = (M + m(j-1) +(i-1))

关于输出数据的操作,主要包括对输出数据分配内存空间,即

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

和输入数据一样,同样需要一个指向数据的指针变量

double *a;
A = mxGetPr(plhs[0];

下面给出了一个简单的例子,函数返回两个数的和。


#include "mex.h"

double testAdd(double x, double y){
    return x + y;
}

void mexFunction(
    int nlhs,
    mxArray *plhs[],
    int nrhs,
    const mxArray *prhs[]){
    double *a;
    double b,c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = testAdd(b,c);
}

利用VS编写MEX

1.打开VS,新建项目,选择MFC DLL

2.配置项目属性

  • C/C++ -> Additional Include Dirrctories 包含目录, 添加MATLAB安装目录下的\extern\include路径
  • Linker -> General -> Additional Library Directories 库目录, 添加MATLAB安装路径下的\extern\lib\win64\microsoft
  • Linker -> Input -> Additional Dependencies 附加依赖项,添加libmx.lib;libmex.lib;libmat.lib;

3.创建编辑输出函数
在源文件的路径下新建.def的文件,在文件内写入

EXPORTS mexFunction

在项目属性页的Linker->Input->Module Definition File内加入创建的***.def文件。

另外,更改Configuration Properties->General->Target Extension内容.mexw64

4.编写MEX文件
MEX文件编写要求与MATLAB内的一致。

5.VS编译MEX
编写完成后进行BUILD,没有错误在源码上一级的x64文件夹中的Debugw中会生成MATALB MEX类型的输出文件,可以在MATLAB环境下进行验证。


reference:
https://www.cnblogs.com/arxive/p/4687766.html
https://blog.csdn.net/bensnake/article/details/78832169

posted @ 2019-04-01 17:30  雷达说  阅读(2269)  评论(0编辑  收藏  举报