专栏
标签
如何在M脚本中调用C文件
技术分享
发布于 2025-07-10 10:48:04
查看 1过去327天

1.MEX 文件的源代码用C编写,并通过一组 MEX API,提供了 C 与 M 语言的数组之间交互的功能。遵循以下的入口函数规范,将对应 C 文件编译成动态库后可直接由 M 语言调用。

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

其中 nlhs 表示 M 语言在调用该函数时的实际参数个数,plhs 表示指向参数列表的指针, nrhs 表示调用该函数时的返回值个数,prhs 表示指向返回值列表的指针。

2.M语言兼容工具支持将符合MEX接口规范的C文件编译成动态库,并能加载和调用该动态库。例如,创建一个c_cumsum.c文件,完整代码如下:

#include "mex.h"
#include "assert.h"
#include "stdio.h"
#include "math.h"

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[]) {
    // 检查输入
    if (nlhs == 0) {
        return;
    }
    if (nlhs > 1) {
        mexErrMsgTxt("Too many output arguments.");
    }
    if (nrhs != 1) {
        mexErrMsgTxt("one input required.");
    }
    if (!mxIsDouble(prhs[0])) {
        mexErrMsgTxt("Input must be of type double.");
    }

    // 提取指向输入数组的数据的指针
    double *input1 = mxGetPr(prhs[0]);
    int N = mxGetNumberOfElements(prhs[0]);

    // 创建和输入相同大小的矩阵作为输出
    int s1 = mxGetM(prhs[0]);
    int s2 = mxGetN(prhs[0]);
    mxArray *B = mxCreateDoubleMatrix(s1, s2, mxREAL);
    double *out = mxGetPr(B);
    double tmp = 0;

    // cumsum,求累加和
    for (int i = 0; i < N; ++i) {
        tmp += input1[i];
        out[i] = tmp;
    }

    // 将结果赋给 lhs
    plhs[0] = B;
}

3.启动M命令行窗口,输入以下命令,即可将c_cumsum.c文件编译成动态链接库c_cumsum.mexdll,然后加载动态库并调用其算法函数。
代码:

mex c_cumsum.c
loadmex("./c_cumsum.mexdll")
x = rand(50000,1);
y = c_cumsum(x);
sum(abs(y-cumsum(x)))

image.png
4.如果是linux环境,输入以下命令:

mex c_cumsum.c
loadmex("./c_cumsum.mexso")
x = rand(50000,1);
y = c_cumsum(x);
sum(abs(y-cumsum(x)))

image.png

所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境
科学计算

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天