快速学会matlab与C混合编程(mex文件)

快速学会matlab与C混合编程(mex文件)

matlab编程很强大,但是很多成熟稳定的C语言代码也可以通过混合编程将其充分利用。混合编程的核心是mex文件的编写。参考连接:https://blog.51cto.com/gjwrxz/6283390

0. 编程环境

g++ gcc 版本 16.1.1 20260430 (GCC)
matlab 2024a linux 
/opt/MATLAB/R2024a/extern/examples/refbook/timestwo.c

1. C代码mex文件

#include "mex.h"
// timestwo.c  
/*
 * timestwo.c
 * Computational function that takes a scalar and doubles it.
 *
 * This is a MEX-file for MATLAB.
 * Copyright 1984-2018 The MathWorks, Inc.
 */

void timestwo(double y[], double x[]) {
    y[0] = 2.0 * x[0];
}

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) {
#if MX_HAS_INTERLEAVED_COMPLEX
    mxDouble *x, *y;
#else
    double *x, *y;
#endif
    size_t mrows, ncols;

    /* Check for proper number of arguments. */
    if (nrhs != 1) {
        mexErrMsgIdAndTxt("MATLAB:timestwo:invalidNumInputs", "One input required.");
    } else if (nlhs > 1) {
        mexErrMsgIdAndTxt("MATLAB:timestwo:maxlhs", "Too many output arguments.");
    }

    /* The input must be a noncomplex scalar double.*/
    mrows = mxGetM(prhs[0]);
    ncols = mxGetN(prhs[0]);
    if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows == 1 && ncols == 1)) {
        mexErrMsgIdAndTxt("MATLAB:timestwo:inputNotRealScalarDouble",
                          "Input must be a noncomplex scalar double.");
    }

    /* Create matrix for the return argument. */
    plhs[0] = mxCreateDoubleMatrix((mwSize)mrows, (mwSize)ncols, mxREAL);

    /* Assign pointers to each input and output. */
#if MX_HAS_INTERLEAVED_COMPLEX
    x = mxGetDoubles(prhs[0]);
    y = mxGetDoubles(plhs[0]);
#else
    x = mxGetPr(prhs[0]);
    y = mxGetPr(plhs[0]);
#endif
    /* Call the timestwo subroutine. */
    timestwo(y, x);
}

2. 编译与提示

>> mex timestwo.c
使用 'gcc' 编译。
错误使用 mex
'/home/nication/WORKM/Code/codeMatlab/matlabBeginToPraticeCode/chapter02/timestwo.mexa64'
不是 MEX 文件。 有关详细信息,请参阅<a href="matlab: helpview([docroot
'/matlab/helptargets.map'],'ENOTMEX')">文件不是 MEX 文件</a>。

我这里出现了错误信息提示,但依旧生成了mex文件timestwo.mexa64。

3. 运行及结果

>> timestwo(5.5)
ans =
    11

4. 总结mex文件的编写可以分为三个步骤,数据传入,数据处理,数据导出

  • 传入矩阵用mxGetPr,传入数值用mxGetScalar;

  • 获取2维矩阵维度用mxGetM,mxGetN,C模块无法同时获得3维矩阵的三个维度,维度需要自己手动传递,可以用函数mxGetDimensions: 就是返回一个指针ptr,每一个指针所指向的值是每一个维度的元素个数;

  • 数据在内存上都是连续的,访问的时候按列的顺序访问;

  • 数据传出用mxCreateDoubleMatrix,先创建一个double类型的指针用来存放要导出的数据,然后再拷贝到plhs[i]对应的指针上;

5. MEX文件:

入口子程序mexFunction( int nlhs, mxArray plhs[], int nrhs, const mxArrayprhs[] ) 参数含义为:

  • nrhs:为输入参数的数目;
  • prhs:为输入参数数组,是指针数组;
  • nlhs:为输出参数的数目;
  • plhs:为输出参数数组,是指针数组;
  • 计算功能子程序:包含所有的实际需要完成的功能源代码,可以是用户以前所编写的算法和程序,以函数的形式存在;
  • 必须包含mex.h库:#include”mex.h”
posted @ 2026-06-21 10:32  叕叒双又  阅读(4)  评论(0)    收藏  举报