快速学会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”
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。
浙公网安备 33010602011771号