mex matlab 与C语言的简单使用

使用mex在matlab中调用C语言的函数,简单记录一下

1.在同一个文件夹下新建.txt,修改为.c,在vs中打开进行编译;在同一个文件夹下新建matlab的文件,调用C语言的主函数

mex matlab 与C语言的简单使用_第1张图片

2.编辑C语言代码

#include "mex.h"

/******************************************************************************/
/** main function 
* @param[in] nlhs:number of left-hand side(output)  plhs: the param of left-hand side(output)
             nrhs:number of right-hand side(input)  prhs: the param of right-hand side(input)
*
* @return
*
*//*
* History        :
* 1.Date         : 2020/8/3
*   Author       : 
*   Modification : Created function

*******************************************************************************/
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
    
    /* input the x y z data */
    if (nrhs == 5)
    {

    }
    else
    {
        mexPrintf("hello");
    }
}

3.在matlab同一个目录下编译C代码

matlab中输入mex -g swim_main.c  % 暂时编译只使用这个文件即可,每次修改需要重新编译

编译成功:>> mex -g swim_main.c
使用 'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。

若编译不成功,查看代码是否有错误,前提是安装了mex,

setenv('MW_MINGW64_LOC','C:\TDM-GCC-64') % 按安装好后还需要在matlab中运行这句话,配置一下环境

4.调用程序

swim_mexFunction.m中编写

swim_main(0,0); % C语言中函数的入口,运行文件

运行swim_main(0,0),会执行C代码;

关于程序的数据和输出,比如在运行函数是[a1,a2,a3,a4]=swim_main(x, y, z, norm,1); % 这种形式nrhs=5,输入的个数; nlhs=4,输出的个数。程序自动识别,不需要指定输入输出个数。

5.将程序运行的多个结果传递出matlab函数

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) 
{
    float *filter_x, *filter_y, *filter_z;
    ACC_DATA_T* XYZ_filtered;

    DealSwimData(x, y, z, &XYZ_filtered);
        
    plhs[0] = mxCreateNumericMatrix(1, 1, mxSINGLE_CLASS, mxREAL);
    plhs[1] = mxCreateNumericMatrix(1, 1, mxSINGLE_CLASS, mxREAL);
    plhs[2] = mxCreateNumericMatrix(1, 1, mxSINGLE_CLASS, mxREAL); /* 后面参数不同,输出数据的类型不同*/

    filter_x = mxGetPr(plhs[0]);
    filter_y = mxGetPr(plhs[1]);
    filter_z = mxGetPr(plhs[2]);

    *filter_x = XYZ_filtered->x; //将这三个数据传递出去
    *filter_y = XYZ_filtered->y;
    *filter_z = XYZ_filtered->z;
}

matlab里面的代码为

for j=1:length(xdata)
        [xfilter(j), yfilter(j), zfilter(j)] = swim_main(0,xdata(j),ydata(j),zdata(j)); % C语言中函数的入口,运行文件
end

..

你可能感兴趣的:(matlab)