Matlab与C语言接口(一)

Matlab与C语言接口(一)

Matlab C/C++编译器设置

​ Matlab可以将C/C++程序编译为Mex文件供Matlab直接调用。在Matlab的命令行中输入命令mex -setup C++进行配置。

image-20220328143924545

Mex文件介绍

​ 在Matlab开发环境中调用C/C++等外部程序需要借助编译器将C/C++代码编译为Mex文件后才能实现,其中Mex文件包含Matlab解释器可以动态转载和执行的动态链接模块。本文作者是在Win10平台下Matlab2017b,Mex文件以动态链接库的形式存在,扩展名为.mexw64

image-0220328144529795

通过C语言编写代码,然后通过Matlab编译器进行编译有几点好处。

  • 加快程序的执行速度。有的模块在Matlab中执行效率低下,可以用C语言来实现这类模块,编译成为Mex文件,可以提高执行效率。
  • 扩展Matlab的功能。

​ 需要注意几点。Mex文件的执行优先级比一般的Matlab程序高,如在一个目录下有Matlab函数名称与Mex文件名称相同的,则只会调用Mex文件;help命令无法查看.mexw64文件的帮助信息,如需提供,需要在与Mex文件相同目录下放置名称相同的.m文件。

Hello World!

每次新学一门语言规则的时候,都会有一个Hello World的示例代码,我这里也提供一个。

# include "mex.h"

void mexFunction(
    int nargout,
    mxArray *out[],
    int nargin,
    const mxArray *in[]
)
{
    mexPrintf("Hello World!\n");
}

​ Mex文件有其自己的书写格式,语法规则和C/C++是一致的,但是一些函数功能必须调用Matlab所规定的。

​ 这里解释一下,Mex文件必须包含mex.h,其入口函数为mexFunction函数名不能变。第一个参数为输出参数的个数;第二个参数为输出参数,类型必须是mxArray;第三个参数为输入参数的个数;第四个参数为输入参数。

​ 执行过程,在Matlab命令行下输入mex ***.cpp将编写的C语言文件编译为Mex文件,会提示编译成功。在相同的目录下可以找到***.mexw64文件,这就是编译成功的Mex文件。

image-20220328151913238 image-20220328151927385

Mex函数的数据类型

​ 用C语言编写Mex文件的一个关键之处在于mexFunction函数中关于Matlab与C代码模块的数据交互问题。

mxArray类型

​ Matlab所有的数据类型都可以用mxArray来描述。在混合编程时需要调用Matlab提供的一些API函数去实现与C语言的基本数据类型之间的相互转换。其中,以mx开头的Matlab API函数主要是提供对mxArray进行操作的函数,而以mex开头的Matlab API函数则提供Matlab环境后台操作的函数。

size_t类型

不同的机器和编译器,size_t的定义是不同的,比如下面这几种定义都有可能出现:

typedef unsigned int size_t;
typedef int size_t;
typedef short size_t;
typedef unsigned short size_t;

也可能出现其他定义。总的来说,size_t主要用来作为sizeof函数的返回类型,或者作为
描述变量或者内存长度的一种类型。其作用是为了程序代码的通用性。

mwIndex和mwSize数据类型

mwIndex用以表示阵列索引;mwSize用以表示大小,比如阵列维数或者阵列长度。其定义包含在Matlab的extern\include\tmwtypes.h文件中

image-20220329113233823

在Matlab2017b中,mwIndexmwSize都是采用size_t的数据类型。

mxChar和mxLogical数据类型

mxCharmxLogical是Matlab自定义的两个数据类型,在extern\include\matrix.h
可以找到它们的定义。mxLogical是bool类型,mxchar是16位字符类型,Matlab默认的字符存储方式。

image-20220329142754601

mxClassID数据类型

mxClassID是枚举类型,用来描述Matlab的阵列类型,所有的Matlab阵列类型都有一个对应的枚举量ID,比如元组阵列的ID为mxCELL_CLASS。因而使用mxClassID类型可以很方便地判
断某一Matlab阵列(用mxArray表示)属于哪一种类型。同样定义在extern\include\matrix.h
中。

image-20220329143537033

mxComplexity数据类型

mxComplexity类型用以区分浮点数值阵列是实数还是复数,它也是一个枚举类型,定义在文
extern\include\matrix.h中。

image-20220329143756283

上面主要介绍了Mex函数涉及的一些基础数据类型,matrix.h文件中主要定义了与矩阵相关的类型和方法,都以mx开头。tmwtypes.h文件中主要定义了与Matlab和Simulink,实时运算相关的数据类型,无固定开头。

参考资料

《精通Matlab与C/C++混合程序设计(第2版)》,刘维编著。

posted @ 2022-08-05 16:22  不秃头的程序员不秃头  阅读(517)  评论(0)    收藏  举报