• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

MATLAB - VS2017 的MEX开发

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

写在前面

  • 关于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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
我常用的delphi 第三方控件发布时间:2022-07-18
下一篇:
Delphi 获取系统时间分隔符发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap