前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab和C,C++的混合编程

Matlab和C,C++的混合编程

原创
作者头像
ZC_Robot机器人技术
发布2021-03-19 21:14:09
3.4K6
发布2021-03-19 21:14:09
举报
文章被收录于专栏:机器人技术与系统Robot
混合编程
混合编程

Matlab具有丰富的函数库以及计算资源,但是m语言的计算效率较差。但是c和c++的计算效率较高,而函数库没有matlab丰富。因此有必要采用Matlab和C,C++的混合编程。混合编程可以借用二者之间的优势而充分发挥作用。采用mex对matlab编译环境进行设置。

代码语言:javascript
复制
mex -setup

则在matlab中输出如下信息:

代码语言:javascript
复制
MEX 配置为使用 'Microsoft Visual C++ 2019 (C)' 以进行 C 语言编译。
要选择不同的 C 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2015 (C) mex -setup:'C:\Program Files\MATLAB\R2020b\bin\win64\mexopts\msvc2015.xml' C
Microsoft Visual C++ 2017 (C) mex -setup:'C:\Program Files\MATLAB\R2020b\bin\win64\mexopts\msvc2017.xml' C
Microsoft Visual C++ 2019 (C) mex -setup:C:\Users\******\AppData\Roaming\MathWorks\MATLAB\R2020b\mex_C_win64.xml C
要选择不同的语言,请从以下选项中选择一种命令:
 mex -setup C++ 
 mex -setup FORTRAN

由于本文中采用的是C++程序,因此可以采用mex -setup C++对环境进行设置

MEX 配置为使用 'Microsoft Visual C++ 2019' 以进行 C++ 语言编译。

代码语言:javascript
复制
要选择不同的 C++ 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2015  mex -setup:'C:\Program Files\MATLAB\R2020b\bin\win64\mexopts\msvcpp2015.xml' C++
Microsoft Visual C++ 2017  mex -setup:'C:\Program Files\MATLAB\R2020b\bin\win64\mexopts\msvcpp2017.xml' C++
Microsoft Visual C++ 2019  mex -setup:C:\Users\********\AppData\Roaming\MathWorks\MATLAB\R2020b\mex_C++_win64.xml C++

因此在matlab 中编写程序add.cpp,用于实现加法,可以有

代码语言:javascript
复制
#include <iostream>
#include "mex.h"
using namespace std;
 
double addab(double x, double y)
{
    return x + y;
}
   
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *a;
    double b, c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = addab(b, c);
}

因此在matlab 中编写程序sub.cpp,用于实现加法,可以有

代码语言:javascript
复制
#include <iostream>
#include "mex.h"
using namespace std;
double subab(double x, double y)
{
    return x - y;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *a;
    double b, c;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    a = mxGetPr(plhs[0]);
    b = *(mxGetPr(prhs[0]));
    c = *(mxGetPr(prhs[1]));
    *a = subab(b, c);
}

在上述程序中,编写了两个数值计算的函数。因此进一步可以编译上述两个程序可以有:

代码语言:javascript
复制
mex add.cpp 
代码语言:javascript
复制
mex sub.cpp

因此在此文件下会产生:

add.mexw64

sub.mexw64

在上述程序中,double subab(double x, double y);double addab(double x, double y)为相应的函数计算。

为此需要进一步编写函数:voidmexFunction(int nlhs, mxArray *plhs[], int nrhs,const mxArray *prhs[])

nlhs: :number of left hand size parameters,也就是Matlab调用语句左边的变量个数,实际上就是需要返回给Matlab的返回值变量有多少个。例如上面c = add(a, b);就只有一个返回参数c,所以nlhs就是1; plhs: 感觉是pointer of left hand size parameters,也就是函数返回参数的指针。但它是一个指针数组。换句话说,它是一个数组,每个元素是个指针,每个指针指向一个数据类型为mxArray的返回参数。例如上面c = add(a, b);就只有一个返回参数c,所以该数组只有一个指针,plhs[0]指向的结果会赋值给c。 nrhs: 这个是number of right hand size parameters,也就是Matlab调用语句右边的变量个数。例如上面c = add(a, b),它给c++代码传入了两个参数a和b,所以nrhs为2; prhs:这个是pointer of right hand size parameters,和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了a,prhs[1]指向了b。要注意prhs是const的指针数组,即不能改变其指向内容。 plhs[0]=mxCreateDoubleMatrix(1,1, mxREAL)

上述语句主要用于规定输出量的的数组维度。而输入函数则不需要进行指定。

最终通过如下语句进行测试:

c=sub(400,200)

代码语言:javascript
复制
c=200

c=add(100,200)

代码语言:javascript
复制
c=300

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档