如何在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)))

4.如果是linux环境,输入以下命令:
mex c_cumsum.c
loadmex("./c_cumsum.mexso")
x = rand(50000,1);
y = c_cumsum(x);
sum(abs(y-cumsum(x)))

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