MATLAB调用C++代码

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; 
}

 


版权声明:本文为zh15237774494原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。