matlab如果需要调用c/c++代码的话, 需要把对应的C/C++代码进行修改, 然后使用mex进行编译.
步骤如下
需要用到的头文件
#include <mex.h>
1: 首先要注意的是C文件的格式. 格式如下:
需要在c文件中写上一个MATLAB入口函数
//这种 //注释 不能出现在文件中
//可以使用 /**/进行注释
// 需要注意, 第4个参数, 是有const的, 这个const不能去掉
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// nlhs 代表返回值个数
// plhs 代表返回值列表
// nrhs 代表参数个数
// prhs 代表返回值列表
}
在上边的mexFunction之中, 可以调用其他函数.
2: 在matlab中的操作
//在控制台输入
mex -setup
//上述操作后, 会让你选择一个编译器. 选择c++即可
3: 对文件进行编译
//对文件进行编译, 只需要输入
cd .c文件所在目录
mex source.c source1.c //即可
4: 如果编译成功, 则会在当前路径下, 生成一个.mexa64文件
在matlab中, 命令行输入
source //(source为文件名). 即可运行
真实的调用场景, 可能会涉及到参数的传递和解析 mexFunction中的4个参数, 分别对应着输入参数个数, 输入参数列表, 输出参数个数, 输出参数列表. 在使用的时候, 可以对这几个参数进行赋值. 从而达到数据传递的效果
mexFunction 参数读取示例
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//获取一个double类型的参数
double value1 = mxGetScalar( prhs[0] ); //方式1
double value2 = *mxGetPr(prhs[0]); //方式2
mexPrintf("value1 = %f value2 = %f\n", value1, value2);
//获取一个char*
char buf[1024] = {0};
int ret = mxGetString(prhs[1], buf, 1024);
//成功获取到string(哪怕这个string的值是'') 返回0
//没有获取到string(比如只传递了一个参数, 或者参数2是其他类型) 就返回1
}
mexFunction 参数返回示例
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *retValue; //要被返回的数据
//创建一个矩阵数据, 用作返回数据
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
retValue = mxGetPr(plhs[0]);
*retValue = 1000; //要被返回的值是1000
}
完整的参数获取与参数返回例子
int add(int x, int y)
{
return x+y;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//判断输入参数是不是符合要求
if(nrhs <1)
{
mexPrintf("input param count error\n");
return;
}
int x = mxGetScalar(prhs[0]); //获取输入参数的值
int y = mxGetScalar(prhs[1]);
double *retValue; //用作返回的参数
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //创建返回矩阵
retValue = mxGetPr(plhs[0]); //retValue指向返回参数
*retValue = (double)add(x, y); //retValue 参数赋值
return;
}