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

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值