【MATLAB和C联合编程】系列教程第5课:续说并详谈MATLAB MEX文件

创作时间:2021-01-19
标题:
【MATLAB和C联合编程】系列教程第5课:详谈MEX文件
导读:
回顾下第4课,我们在matlab中编写C代码,而且是一种可被编译成mex文件的C代码,该C代码的格式与关键字是有一定的约定。
那么,这里我们需要思考2个问题:
1) 为什么要走“c代码-编译为mex-再在matlab中运行”,这么麻烦的,直接用m代码运行不就完了,为什么要这样走所谓的“弯路”呢?
2)为什么需要这种格式有要求的C代码?根本原因是什么?

回答下这两个问题:
答问题1:
您可以通过 MATLAB® 命令行调用您自己的 C、C++ 或 Fortran 程序(就当它们是内置函数一样)。
这些程序称为 MEX 函数。
MEX 函数并不适用于所有的应用程序。
MATLAB 是一种高生产率环境,尤其适用于消除像 C 或 C++ 等编译语言中需要花费大量时间的低级编程。
一般情况下,请在 MATLAB 中进行编程。除非您的应用程序需要,否则请不要使用 MEX 文件。
答问题2:
要创建 MEX 函数,请使用 MATLAB API 编写您的程序,然后使用 mex 命令编译它。
这些 ==API ==提供以下功能:
a)从 MEX 函数中调用 MATLAB 函数。
b)无缝集成到 MATLAB 中,从 MATLAB 获取输入并向其返回结果。
c)支持 MATLAB 数据类型。

从 MATLAB R2018a 开始,请使用这些支持 C++11 编程功能的 API 编写您的 C++ MEX 函数。
这些 API 基于 matlab::data::Array 类,提供更好的类型安全性、数组边界检查并支持现代 C++ 构造以简化编码。

我使用的是matlab 2019a.
目录:
1.mex文件简介
2.mex源文件的结构
3.调试mex文件

正文:

1.mex文件简介
mex是matlab executable 的缩写,意思是在matlab中可执行。
通过C或者Fortan语言开发,经过编译,生成的目标文件能够被M语言解释器调用执行。

mex文件的使用和m文件类似,但是优先m文件执行。

2.mex源文件的结构

//mex源文件的结构,标准写法
#include "mex.h"//必须加
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
  const mxArray *prhs[])
  {
  }

在这里插入图片描述

如果说C/C++语言程序设计中的main函数提供了 操作系统和C语言子程序之间的接口。
那么mexFunction 函数的作用就是提供了MATLAB与C/C++子程序之间的接口。
#include “mex.h”//必须加。
mexFunction不是您调用的例程。
而是mexFunction是C中每个MEX函数都需要的网关函数的名称。 调用MEX函数时,MATLAB®查找并加载相同名称的相应MEX函数。
然后,MATLAB在MEX函数中搜索名为mexFunction的符号。 如果找到一个,它将使用mexFunction符号的地址调用MEX函数。
如果MATLAB无法在MEX函数中找到名为mexFunction的例程,则会显示一条错误消息。

4个参数分别用来输出和输入数据:
nlhs 是输出参数个数;
plhs 是输出参数指针;
指向期望的mxArray输出参数的指针数组;
nrhs 是输入参数个数;
prhs 是输入参数指针,
指向mxArray输入参数的指针数组。
不要修改MEX文件中的任何prhs值。,
更改这些只读mxArrays中的数据可能会产生不良的副作用。
注意:
对输出和输入参数的操作都是通过指针的方式进行的。

指向mxArray输入参数的指针数组。 不要修改MEX文件中的任何prhs值。 更改这些只读mxArrays中的数据可能会产生不良的副作用。

3.调试mex文件
对于比较复杂的功能,并且是通过mex文件来实现,在MATLAB环境中调试mex文件就比较麻烦,这时候我们应该结合使用vs(C的开发环境)中进行调试。注:
我自己使用的是VS2017,下文指的vs即默认是vs2017,其他版本使用上稍有差异而已。

举个例子,步骤如下:

1)编写我们的测试文件


// demo_mextest.c
#include "mex.h"//必须加
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])//mexFunction标准写法
{
    
    
    printf("hello mex world!\n");
    mexPrintf("hello mex world!\n");
}

2)为了可以在vs中调试mex,进行编译,注意此处多了“-g”

%matlab 窗口运行结果
>> mex demo_mextest.c -g
使用 'Microsoft Visual C++ 2017 (C)' 编译。
MEX 已成功完成。

3)附加进程
在这里插入图片描述

在这里插入图片描述

4)在VS中,对程序中设置断点,以便观察过程结果。

在VS中,设置断点的方法,在想要设置断点的代码处,鼠标右键,选择断点。
在这里插入图片描述

5)在matlab的命令行窗口,运行mex 文件。
运行结果,会如我们所设置的那样,在断点处暂停,因此可以 采用这种方法进行mex文件程序调试。

%matlab 窗口运行结果
>> demo_mextest
hello mex world!
hello mex world!

在这里插入图片描述
另外,值得说明的是,在调试过程中,VS和MATLAB是关联的,待代码继续运行结束,才可以再操作matlab,否则,在断点处,MATLAB界面不响应。


THE END~

猜你喜欢

转载自blog.csdn.net/hahahahhahha/article/details/112798317
Mex