MATLAB作为科学计算的工具,目前已经广泛应用于计算机科学、数学科学、生物科学等领域,其拥有丰富的功能,在科学计算与数据可视化方面表现尤为突出,并且其编程简单。但是,由于MATLAB是一种解释型语言,其执行过程是编译一句,执行一句,并且,作为一种解释型语言,其不需要事先定义变量,这就要求其在运行的过程中不断地动态分配内存,这都限制了MTALAB的执行速度。C++刚好可以弥补其在速度上的缺陷,C++是代码一次性编译后,全部装载到内存中进行执行。并且可以利用C++来完成MATLAB不易完成的工作。因此,进行C++与MATLAB语言混合编程是十分有必要的。
简单介绍编译型语言与解释型语言的区别:
用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成机器语言,把源高级程序编译成为机器语言文件,比如Windows下的.exe文件。以后就可以直接运行而不需要编译了,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
解释型语言编写的程序不需要编译。解释型语言在运行的时候才翻译,比如VB语言,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。
环境:Windows10 MATLAB R2018B Visual Studio2017
1、MATLAB内调用C++进行编程
打开MATALB,依次输入mex -setup C++和mbuild -setup
至此,使用MATLAB调用C++配置完成。
2、VS内调用MATALAB进行编程
视图——>属性页,添加目录。
(1)点击右边向下的箭头,选择编辑
点击上图所示添加,选择C:\MATLAB\R2018b\extern\include目录
(2)同理,添加库目录为C:\MATLAB\R2018b\extern\lib\win64\microsoft,点击应用。效果如下:
(3)在属性页-链接器-输入-附加依赖项中添加 libmat.lib;libeng.lib;libmx.lib;
(4)在计算机——>右键——>属性——高级系统设置——环境变量中Path环境变量添加:C:\MATLAB\R2018b\bin\win32
C:\MATLAB\R2018b\bin\win64,效果如下:
至此,在VS中编写MEX文件的配置就完成了。
确认以上步骤执行完成之后,重启计算机,使得某些配置生效。
1、VS2017中进行测试
(1)打开VS2017,新建——>空项目
(2)添加源文件,命名为test.cpp,源文件内容为
#include
#include
#include
#include"engine.h"
// 添加matlab引擎库的头文件
// 导入相关lib库
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
int main()
{
Engine *ep;
// 启动引擎
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\n打开Matlab引擎失败!\n");
return EXIT_FAILURE;
}
// 执行:
int Nsample = 50;
const double PI = 3.1415926;
double *t = new double[Nsample];
for (int i = 0; i < Nsample; i++)
{
t[i] = i * 2 * PI / Nsample;
}
mxArray *T = NULL, *result = NULL;
T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, Nsample * sizeof(t[0]));
// 把变量T存入Matlab工作区
engPutVariable(ep, "X", T);
// 执行Matlab命令
engEvalString(ep, "Y=cos(X);");
engEvalString(ep, "plot(X,Y);");
engEvalString(ep, "title('y=cos(x)');");
engEvalString(ep, "xlabel('x');");
engEvalString(ep, "ylabel('y');");
fgetc(stdin);
// 清除对象,不能漏!
mxDestroyArray(T);
engEvalString(ep, "close;");
// 关闭引擎,不能漏!
engClose(ep);
return EXIT_SUCCESS;
}
先不用理解代码的含义,直接运行即可。如果运行成功,结果如下,则说明配置成功。
2、MATLAB中进行测试
(1)打开MATLAB,创建文件夹D:\HiMat
(2)文件夹HiMat下创建文件himatlab.cpp,该源文件内容为:
#include "mex.h"
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("hello matlab in C/CPP.\n");
}
理解:四个参数分别用来输出和输入数据
nlhs 输出参数个数,plhs 输出参数指针
nrhs 输出参数个数,prhs 输出参数指针
注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。MATLAB可以通过这些指针,访问内存中的数据。
(3)对(2)中写的文件进行编译,切换MATLAB使用命令mex himatlab.cpp进行编译。编译完成之后,生成*.mexw64文件。(*表示文件名)
(4)直接输入文件名,即himatlab或者himatlab()即可在MATLAB中调用使用C++编写的程序,推荐使用后者,执行结果如下。
参考文献:
1.https://blog.csdn.net/qq_33353186/article/details/79146234
2.https://blog.csdn.net/bendanban/article/details/37830495
3.https://blog.csdn.net/guyuealian/article/details/73743654