Matlab具有丰富的函数库以及计算资源,但是m语言的计算效率较差。但是c和c++的计算效率较高,而函数库没有matlab丰富。因此有必要采用Matlab和C,C++的混合编程。混合编程可以借用二者之间的优势而充分发挥作用。采用mex
对matlab编译环境进行设置。
mex -setup
则在matlab中输出如下信息:
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++ 语言编译。
要选择不同的 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,用于实现加法,可以有
#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,用于实现加法,可以有
#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);
}
在上述程序中,编写了两个数值计算的函数。因此进一步可以编译上述两个程序可以有:
mex add.cpp
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)
c=200
c=add(100,200)
c=300
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。