MATLAB调用C函数

在MATLAB中是可以调用C函数库的,但是要先配置好环境、编译器,并编写一个接口函数对接C和MATLAB。

此mex功能的作用在与可以轻易调用现成的C函数库,或者将低效耗能的部门MATLAB代码改写为C代用。

 

  1. 安装C编译器

MATLAB本身是无法编译C语言的,需要其他编译器的支持。

这里使用的的MinGW-w64,注意:MATLAB版本需要与MinGW-w64版本对应。MATLAB社区中的介绍:

https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler

 

在线安装工具很垃圾一直下载不了,挂梯子也不行。用离线包也可以安装,直接解压到想要的路径即可,6.3版本离线包链接:

https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/6.3.0/threads-posix/seh/x86_64-6.3.0-release-posix-seh-rt_v5-rev2.7z/download

环境变量配置:(路径应根据自己的文件路径更改)

 

 

 

在MATLAB中安装MinGW:

在Matlab命令行运行setenv(‘MW_MINGW64_LOC’,folder),folder为MinGW的安装位置(跟环境变量路径一致即可),要加单引号;

 

检查MinGW是否安装成功:

在Matlab命令行运行mex -setup,如下则成功

 

 

  1. 接口文件编写、编译、调用

接口文件要素:

接口文件是用于关联C环境和MATLAB环境的文件,文件类型是.c,文件的最检模板如下:

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

 

函数名mexFunction 及其参数是固定的,不可改动,在此函数内做接口转换,调用我们需要的C函数完成功能。

 

文件编译:

如果路径中含有多个C文件需要编译的话,使用此编译命令:

mex -output mex_compress *.c %编译所有C文件生成mex_compress二进制文件

 

接口函数调用:

MATLAB中只能调用文件内的mexFunction函数,在此函数内再调用其他功能函数。但需要特别注意的是:MATLAB中调用此函数时,函数名并非使用mexFunction,而是使用文件名!例如文件命名为hello.c时,调用命令则为[c,d] = hello(a,b);

 

更多请参考官网API说明

API:https://ww2.mathworks.cn/help/matlab/cc-mx-matrix-library.html?s_tid=CRUX_lftnav

 

 

  1. 接口参数的传递

参数概念:

接口的参数是和C一样可以双向传递(指针方式)的,接口中的4个形式参数:

int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]

理解此参数稍微困难,一步步明确概念

首先调用传入层面:在MATLAB调用接口的时候,输入的参数并非一一映射到这4个形参上

参数定义:nlhs输出参数个数,plhs[]输出参数值,nrhs输入参数个数,prhs[]输入参数

(L表示左边输出,R表示右边输入)

参数形式:参数值plhs[]和prhs[]实际上是一个地址,地址上是支持多个参数的,并且每个参数都可以是任意格式,包括多维的矩阵,所以该接口实际上的参数个数可以几乎无限扩展。

 

参数输入:

参数通过两个接口输入,nrhs输入的是一个值=总参数个数,plhs[]输入的是一个指针,第一个参数既是plhs[0],第二个参数则是plhs[1]。每一个参数都可以是任意类型,包括矩阵。nrhs=2时代表plhs[0]和plhs[1]上有数据,plhs[2]无数据。获取参数数据方式如下:

unsigned char *idata;

idata = mxGetPr(prhs[0]);//获得指向矩阵的指针

mexPrintf("idata[0] = %d\n",idata[0]);

 

参数输出:

在函数内将数据传出的方式同输入类似,plhs[]既是传出参数的地址,但是nlhs是不需要我们操作的。数据传出方式如下:

先在plhs[0]地址上创建一个数据类型(此处创建一个uint32类型,更多请参考官网)

plhs[0] = mxCreateUninitNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL);

然后通过mxGetPr获取plhs[0]的指针;

unsigned long *out_ptr = mxGetPr(plhs[0]);

然后将参数plhs[0]的指针out_ptr连接到C函数即可

My_C_function(out_ptr);

 

在MATLAB文件中获取mexFunction函数传出的数据:

[c, d] = mex_helloworld(a, b);

c和d既是传出的两个参数,对应plhs[0]和plhs[1]

 

关于mexFunction函数:

这个函数仅用于MATLAB和C的接口,在函数内实现接口转换、检查等功能,不用把C的功能实现程序写在此函数内,正确的做法是在此函数内调用纯C的函数。例如此函数内是不支持printf函数的,代之的是使用MATLAB的mex功能中的mexPrintf函数。函数内调用的C函数内是支持完整的C功能的。

 

猜你喜欢

转载自blog.csdn.net/a1254484594/article/details/109282955